Автоматическое заполнение поля 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)
......