IntegrityError at /users/create/ | NOT NULL constraint failed: users_post.author_id | Django Web App

Я следую учебникам по веб-приложениям от codemy.com Youtube и CS50x. Сейчас я пытаюсь добавить PostCategoryForm в мою функцию создания представления для модели Post в файле views.py.

views.py

def create(request):
    if not request.user.is_authenticated:
        return HttpResponseRedirect(reverse("users:login"))
    if request.method == 'POST':
        # create new post
        if request.POST.get('title') and request.POST.get('content'):
            form = PostCategoryForm(request.POST)
            form.save()
            post=Post()
            post.title = request.POST.get('title')
            post.content = request.POST.get('content')   
            post.author = request.user
            post.category = form
            post.save()
            return HttpResponseRedirect("/users/posts/{id}".format(id= post.id))
    else:
        form = PostCategoryForm()
    return render(request, 'users/create.html', {
        "form": form
    })

models.py

class Post(models.Model):
    title = models.TextField(max_length=255, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    category = models.CharField(max_length=255, default='uncategorized')
    post_date = models.DateField(auto_now_add=True)
    
    def __str__(self):
        return self.title + ' | ' + str(self.author)
    
    def get_absolute_url(self):
        return reverse('users:home')

class PostCategory(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name
    
    def get_absolute_url(self):
        return reverse('users:home')

forms.py

choices = PostCategory.objects.all().values_list('name', 'name')

choice_list = []

for item in choices:
    choice_list.append(item)

class PostCategoryForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['category']

        widgets = {
            'category': forms.Select(choices=choice_list)
        }

есть ли способ решить эту проблему или мне следует изменить функцию представления на представление класса? Заранее спасибо.

def create(request):
    if not request.user.is_authenticated:
        return HttpResponseRedirect(reverse("users:login"))
    if request.method == 'POST':
        # create new post
        if request.POST.get('title') and request.POST.get('content'):
            form = PostCategoryForm(request.POST)
            post=Post()
            post.title = request.POST.get('title')
            post.content = request.POST.get('content')   
            post.author = request.user
            if form.is_valid():
                post.category = form.cleaned_data['category']
            post.save()
            return HttpResponseRedirect("/users/posts/{id}".format(id= post.id))
    else:
        form = PostCategoryForm()
    return render(request, 'users/create.html', {
        "form": form
    })

без сохранения формы и использование .clean_data['category'] решили проблему.

Вернуться на верх