Автоматическое заполнение поля ForeignKey в Django CreateView

Вот мой сценарий. Я хочу, чтобы одно из полей моей модели автоматически заполнялось в зависимости от того, аутентифицирован пользователь или нет. Например, когда пользователь отправляет форму, мне нужно проверить, аутентифицирован ли он, и затем заполнить поле created_by до <User Object>, в противном случае оставить его Null, если это возможно.

Вот моя модель:

class Snippet(models.Model):
    # ---
    create_by = models.ForeignKey(
        User,
        on_delete = models.CASCADE,
        null=True,
    )
    # ---

Вот мое мнение:

class SnippetCreateView(CreateView):
    # ---
        def save(self, request, *args, **kwargs):
            if request.user.is_authenticated:
                user = User.objects.get(username=request.user.username)
                request.POST['create_by'] = user       # --->> TraceBack: due to immutability..
            return super().post(request, *args, **kwargs)
    # ---

Поскольку request.POST QueryDict неизменяем, как я могу его реализовать? Я пробовал несколько способов, например, создать его копию, но ничего не происходит, и это ничего не меняет.

Но...

Я могу реализовать его таким образом, и он работает без проблем. Я думаю, что это решение достаточно грязное, чтобы найти лучший способ. Что вы думаете об этом решении?

class Snippet.CreateView(CreateView):
    # ---
        def save(self, request, *args, **kwargs):
            if request.user.is_authenticated:
                user = User.objects.get(username=request.user.username)
            data = {
                'title': request.POST['title'],
                # ---
                'create_by': user if user else None,
            }
            
            snippet = Snippet.objects.create(**data).save()
            # redirecting to Snippet.get_absolute_url()
    # ---

Это решение применимо, только если вы используете django ModelForm.

class CreateArticle(CreateView):
    model = Snippet

    ......... 
    def form_valid(self, form):
        user = self.request.user
        form.instance.created_by = user if user else None
        return super(CreateArticle, self).form_valid(form)
    ......
Вернуться на верх