在 django vanilla CreateView 上设置当前用户

Mat*_*ski 3 python django django-views

我想用当前登录的用户更新我的模型。我正在使用 django-vanilla-views。为了存储新记录,我正在尝试使用 CreateView。我不想在表单上显示用户,只需自动更新它。

这是我的模型:

class Measurement(models.Model):
    date = models.DateField()
    user = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

class CreateMeasurement(CreateView):
    model = Measurement
    fields = ['date']
    success_url = reverse_lazy('list_measurements')

    def get_form(self, data=None, files=None, **kwargs):
        kwargs['user'] = self.request.user
        return super(CreateMeasurement, self).get_form(data=data, files=files, **kwargs)
Run Code Online (Sandbox Code Playgroud)

不幸的是,在访问视图时,我收到以下异常:

TypeError: __init__() got an unexpected keyword argument 'user'
Run Code Online (Sandbox Code Playgroud)

我还尝试为我的模型创建一个 ModelForm,但得到了完全相同的错误。任何想法我可能做错了什么?

Ala*_*air 5

您不需要将用户传递给表单,因此不要覆盖该get_form方法。您已经field通过fields在视图中设置从模型表单中排除了用户,因此您也不应该需要自定义模型表单。

应该足以覆盖该form_valid方法,并在保存表单时设置用户。

from django.http import HttpResponseRedirect

class CreateMeasurement(CreateView):
    model = Measurement
    fields = ['date']
    success_url = reverse_lazy('list_measurements')

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.user = self.request.user
        obj.save()
        return HttpResponseRedirect(self.get_success_url())
Run Code Online (Sandbox Code Playgroud)