2012-03-02 51 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) 
相关问题