models.py
:
class BlogPost(models.Model):
title = models.CharField(max_length=200)
post_body = models.TextField()
user = models.ForeignKey(User)
pub_date = models.DateTimeField('published')
def get_absolute_url(self):
return u'/entries/%d' % self.id
forms.py
:
class NewPostForm(forms.ModelForm):
class Meta:
model = BlogPost
fields = ('title', 'post_body')
所以,我试图让用户在博客中发布新帖子。BlogPost 模型有 4 个字段 - title
、post_body
、user
和pub_date
. 用户应该能够填写title
和post_body
,而其他两个应该自动填写。我尝试的第一件事是:
class NewPostView(generic.edit.CreateView):
model = BlogPost
form_class = NewPostForm
def get_initial(self):
return {'pub_date': timezone.now(),
'user': self.request.user}
但它唯一做的就是为 html 表单提供默认值。经过进一步研究,这是最终工作的代码:
class NewPostView(generic.edit.CreateView):
model = BlogPost
form_class = NewPostForm
def form_valid(self, form):
obj = form.save(commit=False)
obj.user = self.request.user
obj.pub_date = timezone.now()
obj.save()
return HttpResponseRedirect(obj.get_absolute_url())
所以,虽然覆盖 form_valid 方法有效,但我不觉得它应该怎么做?有没有更好的地方来执行这些操作?这样做的传统方法是什么?