django class-based view - UpdateView - How to access the request user while processing a form?

和自甴很熟 提交于 2019-12-21 09:22:21

问题


In a class-base UpdateView in Django, I exclude the user field as it is internal to the system and I won't ask for it. Now what is the proper Django way of passing the user into the form. (How I do it now, is I pass the user into the init of the form and then override the form's save() method. But I bet that there is a proper way of doing this. Something like a hidden field or things of that nature.

# 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'
),

回答1:


Hacking around like passing a hidden field doesn't make sense as this truly has nothing to do with the client - this classic "associate with logged in user" problem should definitely be handled on the server side.

I'd put this behavior in the form_valid method.

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())



回答2:


Must return an HttpResponse object. The code below works:

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)



回答3:


We can also do like

class MyUpdateView(UpdateView):
    form_class = SomeModelForm

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(MyUpdateView, self).form_valid(form)


来源:https://stackoverflow.com/questions/9541981/django-class-based-view-updateview-how-to-access-the-request-user-while-proc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!