在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'
),
我建議刪除最後兩行('.save()'和'return')並用'super(MyUpdateView,self).form_valid(form)'替換它們。這將簡單地在修改後的表單實例上執行默認的form_valid()(與最後兩行相同),使您的代碼與Django項目對該方法做出的任何未來更改保持同步。 – Bryson 2012-04-24 06:44:40
@Bryson,很好!我以前從來沒有這樣做過。我想,在form.instance上引用實例並不直觀,因此修改會再次影響將來的save()調用。 – 2012-04-24 17:03:37
我錯過了一些東西:不是隻使用'instance ='我相信你應該使用'form.instance ='。這將從請求對象中添加用戶(假設你的表單是由這個字段創建的,否則它將會出錯類似於「Form沒有屬性'的用戶'」)到表單實例,然後通過'超()'。由於它現在寫入了,所以用戶數據的修改表單被保存在一個名爲'instance'的變量中,這個變量永遠不會離開你的'form_valid'版本,因爲你切換到'super()'它永遠不會被保存。對不起,它變得複雜。 haha – Bryson 2012-04-24 18:14:26