2011-12-11 10 views
16

ile request.user kullanma Giriş yapmış kullanıcılar ve bir Django ModelForm ile ilgili bir sorun yaşıyorum. ForeignKeyUser için _Animal_ adında bir sınıf ve yaşı, ırkı ve benzeri gibi hayvanla ilgili bazı veriler var.Django ModelForm

Bir kullanıcı db Hayvanlar ekleyebilir ve her hayvanın yazarı izlemek var, bu yüzden kullanıcı bir hayvan örneği oluşturduğunda kaydettiğine dikkat request.user eklemeniz gerekir.

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 

ana hedefi formda yayıncı alanını gizlemek ve tasarrufu düğmesini vururken açmış kullanıcıyı göndermektir.

Geçerli kullanıcıyı initial kullanarak görüntüleyebilirim, ancak istediğim de alanı görüntülemiyor.

views.py Sadece o zaman, form dışında tutmak görünümünde ayarlamanız gerekir

@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

mi? – shailenTJ

cevap

31

.

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

... ve görünümde.

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

(ayrıca Not ilk else deyimi, bu - çizgiler hemen yönlendirmeyi izlemeye - senin de bırakırsanız gereksiz olduğu, yürütme düşecek özdeştir bakış sonunda iki çizgi, üzerine) biraz daha kısa

+0

Teşekkür ederim Daniel. Son iki satır bu şekilde girilmelidir. – amb

8

başka bir yolu da().
için de bir alan hariç gerekir:

0 daha sonra görünümünde
class AnimalForm(ModelForm): 
    class Meta: 
     model = Animal 
     exclude = ('publisher',) 

: `django.contrib.auth.models` arasında` User` bir örneği

animal = Animal(publisher=request.user) 
form = AnimalForm(request.POST, instance=animal) 
if form.is_valid(): 
    animal.save() 
İlgili konular