Установить пользователя, вошедшего в систему, в значение created_by для django CreateView

Кроме метода form_valid(), какими еще эффективными способами я могу установить пользователя на created by.

views.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)

Вам следует использовать сам 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)

Вы можете обернуть это в миксин, например:

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)

и затем используйте SetUserMixin с:

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

Я придумал нечто подобное, но это не устанавливается в модели.

views.py

   def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['created_by'] = self.request.user
        return context

.html

{% block content %}
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    {{ created_by }}
    <button class="button is-success is-fullwidth is-medium mt-5"
            type="submit">Save
    </button>
   </form>
      </div>{% endblock content %}
Вернуться на верх