2011-12-11 13 views
16

Sto riscontrando un problema con gli utenti registrati e un Django ModelForm. Ho una classe denominata _Animal_ che ha una User e alcuni dati relativi all'animale come età, razza e così via.Utilizzo di request.user con Django ModelForm

Un utente può aggiungere Animali al db e io devo rintracciare l'autore di ciascun animale, quindi devo aggiungere lo request.user che viene registrato quando l'utente crea un'istanza animale.

models.py

class Animal(models.Model): 
    name = models.CharField(max_length=300) 
    age = models.PositiveSmallIntegerField() 
    race = models.ForeignKey(Race) 
    ... 
    publisher = models.ForeignKey(User) 
    def __unicode__(self): 
     return self.name 

class AnimalForm(ModelForm): 
    class Meta: 
     model = Animal 

L'obiettivo principale è nascondere il campo editore in forma, e inviare l'utente connesso quando colpisce pulsante Salva.

Posso vedere l'utente corrente nella vista utilizzando initial, ma quello che voglio anche non è visualizzare il campo.

views.py

@login_required 
def new_animal(request): 
    if request.method == "POST": 
     form = AnimalForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return redirect('/') 
     else: 
      variables = RequestContext(request, {'form': form}) 
      return render_to_response('web/animal_form.html', variables) 
    else: 
     form = AnimalForm(initial={'publisher': request.user}) 
    variables = RequestContext(request, {'form': form}) 
    return render_to_response('web/animal_form.html', variables) 
+0

è il 'user' un'istanza di' django.contrib.auth.models'? – shailenTJ

risposta

31

Hai solo bisogno di escluderla dal modulo, quindi impostare nella vista.

class AnimalForm(ModelForm): 
    class Meta: 
     model = Animal 
     exclude = ('publisher',) 

... e nella vista:.

form = AnimalForm(request.POST) 
    if form.is_valid(): 
     animal = form.save(commit=False) 
     animal.publisher = request.user 
     animal.save() 

(noti anche che la prima else clausola - le linee immediatamente dopo il reindirizzamento - non è necessario se si lascia fuori, esecuzione cadrà attraverso le due linee alla fine della vista, identici)

+0

Grazie mille Daniel. Le ultime due linee dovrebbero essere rientrate a proposito. – amb

8

altro modo (leggermente più corta):.
È necessario escludere campo così:

class AnimalForm(ModelForm): 
    class Meta: 
     model = Animal 
     exclude = ('publisher',) 

poi nella vista:

animal = Animal(publisher=request.user) 
form = AnimalForm(request.POST, instance=animal) 
if form.is_valid(): 
    animal.save() 
Problemi correlati