我正在使用基本的博客应用程序练习django Class-Based-View。 但是,出于某种原因,我的Post模型的CreateView没有将帖子保存在数据库中。
models.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')
forms.py
class PostForm(forms.ModelForm):
class Meta:
model = Post
exclude = ('user', 'post_date')
views.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创建的帖子未保存在数据库中。 任何想法.. ??
由于
答案 0 :(得分:6)
一个提示:在定义表单时不要使用exclude
,使用fields
,是更安全的,也是建议的方法。
重定向由get_success_url
方法定义。如果您的模型中有方法get_absolute_url
CreateView 将重定向到该网址,否则您始终可以在视图中覆盖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/
答案 1 :(得分:1)
问题是您要排除必填字段,因此不会通过表单验证。
您应该使用某个默认值隐藏此字段,让它们填充它们,将它们设置为null = True或在访问form_valid之前填充它们
答案 2 :(得分:0)
我认为这是一个不调用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)
答案 3 :(得分:0)
多年后的今天,我遇到了这个问题,但那些答案似乎并不正确。
这里的主要问题是表单.CreateView的实例为None。所以我的方法如下作为django docs的建议表:
button = browser.find_elements_by_xpath('//h4[@class="start"]')[1].click()