[英]Django CreateView is not saving object
我正在用一个基本的博客应用程序练习 django 基于类的视图。 但是,出于某种原因,我的 Post 模型的 CreateView 没有将帖子保存在数据库中。
模型.py
class Post(models.Model):
user = models.ForeignKey(User)
post_title = models.CharField(max_length=200)
post_content = models.CharField(max_length=500)
post_date = models.DateTimeField('date posted')
表格.py
class PostForm(forms.ModelForm):
class Meta:
model = Post
exclude = ('user', 'post_date')
视图.py
class PostCreate(CreateView):
template_name = 'app_blog/post_save_form.html'
model = Post
form_class = PostForm
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.post_date = datetime.now()
return super(PostCreate, self).form_valid(form)
它显示内容而不会产生任何错误,但是当我检查管理页面时,CreateView 创建的帖子没有保存在数据库中.. 任何想法..??
谢谢
一个提示:在定义表单时不要使用exclude
,使用fields
更安全,也是推荐的方法。
重定向由get_success_url
方法定义。 如果您的模型中有get_absolute_url
CreateView方法将重定向到该 URL,否则您始终可以在您的视图中覆盖get_success_url
。
使用get_absolute_url
:
class Post(models.Model):
user = models.ForeignKey(User)
post_title = models.CharField(max_length=200)
post_content = models.CharField(max_length=500)
post_date = models.DateTimeField('date posted')
@permalink
def get_absolute_url(self):
return ('myurlname', (), {'myparam': something_useful})
使用get_success_url
:
class PostCreate(CreateView):
template_name = 'app_blog/post_save_form.html'
model = Post
form_class = PostForm
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.post_date = datetime.now()
form.save()
return super(PostCreate, self).form_valid(form)
def get_success_url(self):
return reverse('myurlname', args=(somethinguseful,))
我认为在使用 CBV 时,您会发现此页面非常有用: http : //ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/CreateView/
问题是您排除了必填字段,因此它不会通过您的表单验证。
您应该使用一些默认值隐藏这些字段,让使用填充它们,将它们设置为 null=True 或在访问 form_valid 之前填充它们
我认为这是一个不调用form.save()
的简单情况。 当表单被验证时,所有的检查都完成了,但它实际上并没有将对象保存在数据库中。 为此,您需要通过save()
方法明确告诉它。
所以你想要:
class PostCreate(CreateView):
template_name = 'app_blog/post_save_form.html'
model = Post
form_class = PostForm
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.post_date = datetime.now()
form.save()
return super(PostCreate, self).form_valid(form)
多年后我今天遇到了这个问题,但这些答案似乎不正确。
这里的主要问题是 CreateView 的 form.instance 是 None 。 所以我的方法如下作为 django 文档的建议表:
def form_valid(self, form):
instance = form.save(commit=False)
instance.user = self.request.user
instance.post_date = datetime.now()
instance.save()
return redirect(self.get_success_url())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.