Как присоединить внешний ключ при сохранении формы в модель?

У меня есть модель для сайта блога, которая содержит 4 поля - post_author, post_title, post_content и date_published.

Также у меня есть форма для добавления нового поста, которая имеет 2 поля post_title и post_content. Но когда я пытаюсь добавить новый пост, он показывает Error:NOT NULL constraint failed: blog_post.author_id

Мое поле даты в модели должно заполняться автоматически, но User-id, который является внешним ключом, не заполняется.

Как мне прикрепить user_id при сохранении формы?

модель поста:

class Post(models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField()
    date = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

Форма для нового сообщения:

class newPost(forms.ModelForm):
    title = forms.CharField(required =True, max_length=30)
    class Meta:
        model = Post
        fields = ['title','content']

функция просмотра:

@login_required
def newpost(request):
    if request.method == 'POST':
        post = newPost(request.POST or None)
        if post.is_valid():
            #how to add author of this post ??
            post.save()
            messages.success(request,f'New blog post added. Add more if you want')
            return redirect('blog-newpost')
    else:
        post = newPost()
    context = {'title':'New Post','post': post}
    return render(request,'blog/newpost.html',context)

Работает ли это?

@login_required
def newpost(request):
    if request.method == 'POST':
        post = newPost(request.POST or None)
        if post.is_valid():
            #how to add author of this post ??
            # post.save()
            title   = post.cleaned_data['title']
            content = post.cleaned_data['content']
            new_post= Post.objects.get_or_create(
                title=title, 
                content=content, 
                author=request.user
            )
            new_post.save()
            messages.success(request,f'New blog post added. Add more if you want')
            return redirect('blog-newpost')
    else:
        post = newPost()
    context = {'title':'New Post','post': post}
    return render(request,'blog/newpost.html',context)

EDIT: этот тоже может работать

@login_required
def newpost(request):
    if request.method == 'POST':
        post = newPost(request.POST or None)
        if post.is_valid():
            #how to add author of this post ??
            new_post = post.save(commit=False)
            new_post.author = request.user
            new_post.save()
            messages.success(request,f'New blog post added. Add more if you want')
            return redirect('blog-newpost')
    else:
        post = newPost()
    context = {'title':'New Post','post': post}
    return render(request,'blog/newpost.html',context)
Вернуться на верх