首页 > 解决方案 > /post/new/ NOT NULL 约束处​​的 IntegrityError 失败:blog_post.author_id

问题描述

我正在尝试学习 django,但这件事阻止了我这样做,这是我的 view.py

from django.shortcuts import render
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.http import HttpResponse
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from .models import Post
# Create your views here.
 
def home(request):
    context = {
        'posts' : Post.objects.all
    }
    return render(request,'blog/home.html',context)
class PostListView(ListView):
    model = Post
    template_name = 'blog/home.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    # <app>/<model><viewtype>.html
class PostDetailView(DetailView):
    model = Post
class PostCreateView(LoginRequiredMixin,CreateView):
    model = Post
    fields = ['title','content']
class PostUpdateView(LoginRequiredMixin,UpdateView):
    model = Post
    fields = ['title','content']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False
class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin,CreateView):
    #LoginRequiredMixin, UserPassesTestMixin,DeleteView
    #LoginRequiredMixin, AuthorMixin, ListView
    model = Post
    success_url = '/'
    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        else:
            return False
def about(request):
    return render(request,'blog/about.html',{'title':'About'})

这是我在 app 目录中的 models.py:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk':self.pk})

请帮我解决这个错误我是一名自学成才的 Web 开发人员,请给我一些建议,让我在 python 中学习 django 框架,这真的阻止了我实现目标,这耽误了我宝贵的时间

标签: pythondjango

解决方案


PostCreateView创建的实例Post并且您已经设置fields = ['title','content']了含义,只有这些字段会显示在表单中。但是您有一个author不可为空且没有默认值的字段,因此您也需要为此字段设置一个值。如果您想将其设置为当前登录用户,您可以覆盖form_valid表单的方法并在那里执行(您似乎已经在执行此操作PostUpdateView?):

class PostCreateView(LoginRequiredMixin,CreateView):
    model = Post
    fields = ['title','content']
    
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

推荐阅读