35

所以我有一个模型,其中包括:

class Place(models.Model):
    ....
    created_by = models.ForeignKey(User)

我的看法是这样的:

class PlaceFormView(CreateView):
    form_class = PlaceForm

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

有没有办法让我访问 request.user 并将 created_by 设置为该用户?我浏览了文档,但似乎找不到任何提示。

`

4

3 回答 3

35

如何覆盖form_valid表单保存的内容?自己保存,做任何你想做的事,然后做重定向。

class PlaceFormView(CreateView):
    form_class = PlaceForm

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

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.created_by = self.request.user
        obj.save()        
        return http.HttpResponseRedirect(self.get_success_url())
于 2011-04-26T04:00:43.230 回答
22

我知道这是旧的,但对于其他有这个问题的人:

还有一种更简单的方法 - 因为多次保存表单将始终使用相同的模型实例,您也可以这样做:

def form_valid(self, form):
    obj = form.save(commit=False)
    obj.created_by = self.request.user
    return super(PlaceFormView, self).form_valid(form)

这样,您将获得 super 调用的所有好处 - 很容易看到您实际上只是添加了这两行代码,并且您不必通过复制重定向逻辑来重复自己。

于 2015-12-12T11:03:02.187 回答
5

另一种方法是通过覆盖 CreateView 中的 get_initial() 方法传递用户,并修改 PlaceForm 类中的 save 方法以保存用户:

class PlaceForm(forms.ModelForm):
    ...
    ...
    ...

    def __init__(self, *args, **kwargs):
        self.created_by = kwargs['initial']['created_by']
        super(PlaceForm, self).__init__(*args, **kwargs)

    def save(self, commit=True):
        obj = super(PlaceForm, self).save(False)
        obj.created_by = self.created_by
        commit and obj.save()
        return obj

class PlaceFormView(CreateView):
    ...
    ...
    form_class = PlaceForm

    def get_initial(self):
        self.initial.update({ 'created_by': self.request.user })
        return self.initial

这样保存逻辑仍然封装在表单类中。

于 2011-09-11T03:33:01.747 回答