2011-12-11 111 views
16

我遇到登錄用戶和Django ModelForm問題。我有一個名爲_Animal_的課程,它有一個ForeignKeyUser和一些與動物有關的數據,如年齡,種族等。使用request.user與Django ModelForm

用戶可以將動物添加到數據庫,我必須跟蹤每個動物的作者,所以我需要添加用戶創建動物實例時記錄的request.user的

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 

主要目標是隱藏在形式發佈現場,並創下保存按鈕時提交登錄的用戶。

我可以使用initial來捕捉視圖中的當前用戶,但是我也不想顯示該字段。

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

是'django.contrib.auth.models'的'User'一個實例? – shailenTJ

回答

31

你只需要從表單中排除,然後將其設置在視圖中。

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

...並在視圖:

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

(還要注意的是,第一else條款 - 本線立即重定向以下 - 是不必要的,如果你離開它,執行將下降通過對兩行視圖的結束,這是相同的)

+0

非常感謝Daniel。最後兩行應該按順序縮進。 – amb

8

的另一種方式(稍短):
你需要排除字段,以及:

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

然後在視圖:

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