2010-07-01 18 views
7

Powiedzmy mam formularza dodawania/edycji produktów (z pola „użytkownik” jest klucz obcy do mojego użytkowników) wywołany z dwoma oddzielnymi funkcjami view - dodawać/edytować:Django form.save krok po kroku

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

formie jest metoda oszczędzania wygląda następująco:

def save(self, user, *args, **kwargs): 
    self.instance.user = user       
    post = super(ProductAddForm, self).save(*args, **kwargs) 
    post.save() 

Czy ktoś mógłby mi powiedzieć, co się dzieje na tym zaoszczędzić metoda krok po kroku Dlaczego wywołanie super w tej formie i jaka jest różnica w całej obróbki, gdy edytować i zapisywać nowy produkt, jeśli wywołanie funkcji jest takie samo?

+0

Pan spojrzał na docs.python.org, aby zobaczyć, co robi 'funkcja super'? http://docs.python.org/library/functions.html#super Czego się tam nauczyłeś? –

+0

Co masz na myśli przez "edytowanie"? Masz na myśli "walidację"? To osobna cecha formularza. Czy masz na myśli coś innego? –

+0

Przez "2 widoki" rozumiesz "dwie funkcje widoku"? Jeśli tak, proszę ZAKTUALIZUJ swoje pytanie z tymi wszystkimi informacjami. Proszę ZATRZYMAJ dodanie komentarzy. ZAKTUALIZUJ pytanie, aby zawierało WSZYSTKIE fakty. Następnie usuń komentarze. –

Odpowiedz

3

self.instance.user = user

Zapisz argument łatwy do atrybutu użytkownika obiektu self.instance za

post = Super (ProductAddForm, self) .save (* args , ** kwargs)

Wywołanie metody składowania nadklasy w celu uzyskania obiektu wynikowego.

post.save()

więcej wynikowy. To może być niepotrzebny, lub może to być istotne, w zależności od argumentów save.

Zobacz http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/#the-save-method. Jeśli popełnić jest False, to obiekt post nie został zapisany w bazie danych.

Powiązane problemy