python - /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 框架,这真的阻止了我实现目标,这耽误了我宝贵的时间
解决方案
您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)
推荐阅读
- mysql - 如何处理庞大的数据集
- python-3.x - 删除 2 个索引 Python 之间的项目
- c++ - 如何将 stb_truetype 位图加载到 OpenGL 纹理中
- javascript - NUXT - 如何更好地重构计算属性
- r - 如何完全加入具有正确数据类型的 2 个数据帧?
- javascript - 数组映射并根据对象值填充结果
- php - 如何将 php preg_replace 迁移到 preg_replace_callback?
- python - 在python中,循环和pop(0)更好还是先反转它然后pop()
- delphi - 如何将方法指针作为窗口消息参数发送?
- asp.net-core-mvc - Asp.net core RazorComponent 使用动态