Установить пользователя, вошедшего в систему, в значение 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 %}