2012-03-02 27 views
7

在Django的基於類的UpdateView中,我排除了用戶字段,因爲它是系統內部的,我不會要求它。現在什麼是合適的Django將用戶傳入表單的方式。 (我現在怎麼做,是我把用戶傳入表單的init,然後重寫表單的save()方法。但我敢打賭,有一個正確的方法來做到這一點。 。這種性質的東西django基於類的視圖 - UpdateView - 如何在處理表單時訪問請求用戶?

# models.py 
class Entry(models.Model): 
    user = models.ForeignKey(
       User, 
       related_name="%(class)s", 
       null=False 
    ) 

    name = models.CharField(
       blank=False, 
       max_length=58, 
    ) 

    is_active = models.BooleanField(default=False) 

    class Meta: 
     ordering = ['name',] 

    def __unicode__(self): 
     return u'%s' % self.name 

# forms.py 
class EntryForm(forms.ModelForm): 
    class Meta: 
     model = Entry 
     exclude = ('user',) 

# views.py 
class UpdateEntry(UpdateView): 
    model = Entry 
    form_class = EntryForm 
    template_name = "entry/entry_update.html" 
    success_url = reverse_lazy('entry_update') 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(UpdateEntry, self).dispatch(*args, **kwargs) 

# urls.py 
url(r'^entry/edit/(?P<pk>\d+)/$', 
    UpdateEntry.as_view(), 
    name='entry_update' 
), 

回答

7

黑客周圍像傳遞一個隱藏字段沒有意義,因爲這確實無關與客戶 - 這個經典的「聯想與登錄的用戶」的問題一定要處理上服務器端

我會把這種行爲放在form_valid方法中

class MyUpdateView(UpdateView): 
    def form_valid(self, form): 
     instance = form.save(commit=False) 
     instance.user = self.request.user 
     super(MyUpdateView, self).save(form) 

    # the default implementation of form_valid is... 
    # def form_valid(self, form): 
    #  self.object = form.save() 
    #  return HttpResponseRedirect(self.get_success_url()) 
+3

我建議刪除最後兩行('.save()'和'return')並用'super(MyUpdateView,self).form_valid(form)'替換它們。這將簡單地在修改後的表單實例上執行默認的form_valid()(與最後兩行相同),使您的代碼與Django項目對該方法做出的任何未來更改保持同步。 – Bryson 2012-04-24 06:44:40

+0

@Bryson,很好!我以前從來沒有這樣做過。我想,在form.instance上引用實例並不直觀,因此修改會再次影響將來的save()調用。 – 2012-04-24 17:03:37

+0

我錯過了一些東西:不是隻使用'instance ='我相信你應該使用'form.instance ='。這將從請求對象中添加用戶(假設你的表單是由這個字段創建的,否則它將會出錯類似於「Form沒有屬性'的用戶'」)到表單實例,然後通過'超()'。由於它現在寫入了,所以用戶數據的修改表單被保存在一個名爲'instance'的變量中,這個變量永遠不會離開你的'form_valid'版本,因爲你切換到'super()'它永遠不會被保存。對不起,它變得複雜。 haha – Bryson 2012-04-24 18:14:26

2

必須返回一個HttpResponse對象。代碼如下:

class MyUpdateView(UpdateView): 
    def form_valid(self, form): 
     instance = form.save(commit=False) 
     instance.user = self.request.user 
     return super(MyUpdateView, self).form_valid(form) 
相關問題