在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