Скажем, у меня есть форма для добавления/редактирования, что продукты (с полем 'пользователь', являющийся внешним ключом моему Пользователю) инициированный от двух отдельных функций представления - добавляют/редактируют:
def product_add(request):
userprofile = UserProfile.objects.get(user=request.user)
if request.method == 'POST':
form = ProductAddForm(request.POST, request.FILES,)
if form.is_valid():
form.save(user=request.user)
else:
form = ProductAddForm()
return render_to_response('products/product_add.html', {
'form':form, 'user':request.user,
}, context_instance=RequestContext(request))
def product_edit(request, id):
product = get_object_or_404(Product, id=id, user=request.user)
if product.user.id!=request.user.id:
raise Http404
if request.method == 'POST':
form = ProductAddForm(request.POST, request.FILES, instance=product)
if form.is_valid():
form.save(user=request.user)
else:
form = ProductAddForm(instance=product)
return render_to_response('products/product_edit.html', {
'form':form, 'user':request.user,
}, context_instance=RequestContext(request))
Метод сохранения формы смотрит следующим образом:
def save(self, user, *args, **kwargs):
self.instance.user = user
post = super(ProductAddForm, self).save(*args, **kwargs)
post.save()
Кто-то может сказать мне, что происходит в этом методе сохранения шаг за шагом? Почему мы звоним супер на этой форме и каково различие в целой обработке, когда мы редактируем и сохраняем новый продукт, если вызов функции является тем же?
self.instance.user = user
Сохранить аргумент пользователя в пользовательском атрибуте объекта self.instance
post = super (ProductAddForm, self) .save (* args, ** kwargs)
Invoke метод сохранения суперкласса для получения результирующего объекта.
post.save ()
Сохраните получившийся объект. В этом может быть необходимость или необходимость, в зависимости от аргументов save
.
См. http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/#the-save-method . Если фиксация имеет значение False, то объект post
не был сохранен в базе данных.