2010-07-01 2 views
7

Скажем, у меня есть форма для добавления/редактирования продуктов (с полем «пользователь» является внешним ключом к моему пользователя), запускаемый из двух отдельных функций зрения - добавлять/редактировать:Джанго form.save шаг за шагом

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() 

Может кто-нибудь сказать мне, что происходит в этой экономии шаг метода за шагом Почему мы называем супер в этой форме, и какова разница во всей обработке, когда мы редактировать и сохранять новый продукт, если вызов функции тот же?

+0

Вы посмотрели на docs.python.org, чтобы узнать, что делает функция 'super'? http://docs.python.org/library/functions.html#super Что вы там узнали? –

+0

Что вы подразумеваете под «редактированием»? Вы имеете в виду «валидацию»? Это отдельная особенность Формы. Или вы имеете в виду что-то еще? –

+0

Под «2 взглядами» вы имеете в виду «две функции просмотра»? Если да, ОБРАТИТЕ ваш вопрос со всей этой информацией. Остановите добавление комментариев. Пожалуйста, ОБНОВЛЯЙТЕ вопрос, чтобы содержать ВСЕ факты. Затем удалите комментарии. –

ответ

3

self.instance.user = пользователь

Сохранить аргумент пользователя в атрибуте пользователя объекта self.instance в

пост = супер (ProductAddForm, самость) .save (* арг , ** kwargs)

Вызовите метод сохранения суперкласса, чтобы получить результирующий объект.

post.save()

Сохранить полученный объект. Это может быть ненужным, или это может быть необходимо, в зависимости от аргументов save.

См. http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/#the-save-method. Если commit является False, то объект post не был сохранен в базе данных.

Смежные вопросы