将登录用户设置为 django CreateView 的created_by

mik*_*kan 3 django django-models django-forms django-views

除了 form_valid() 方法之外,我还可以将用户设置为创建的其他有效方法。

视图.py

class CreatEEView(LoginRequiredMixin, CreateView,):
    form_class =  ''
    template_name = ''
    success_url = ''

    def form_valid(self, form):
       instance = form.instance
       instance.created_by = Model.objects.get(user=self.request.user)
       instance.save()
       return super().form_valid(form)
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 5

你应该使用self.request.user它本身。此外,您不应该保存将由instance调用处理的super().form_valid(form), 因此:

class CreatEEView(LoginRequiredMixin, CreateView):
    form_class = …
    template_name = …
    success_url = …

    def form_valid(self, form):
       form.instance.created_by = self.request.user
       return super().form_valid(form)
Run Code Online (Sandbox Code Playgroud)

您可以将其包装在 mixin 中,例如:

class SetUserMixin(LoginRequiredMixin):
    user_field = 'created_by'

    def form_valid(self, form):
        setattr(form.instance, self.user_field, self.request.user)
        return super().form_valid(form)
Run Code Online (Sandbox Code Playgroud)

然后使用SetUserMixin:

class CreatEEView(SetUserMixin, CreateView):
    form_class = …
    template_name = …
    success_url = …
Run Code Online (Sandbox Code Playgroud)