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 モデルにはtitle
、post_body
、user
、 の 4 つのフィールドがありpub_date
ます。title
ユーザーはとを入力できる必要がありますがpost_body
、他の 2 つは自動的に入力される必要があります。私が最初に試したのはこれでした:
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メソッドのオーバーライドはうまくいきましたが、それがどのように行われるべきだとは思いませんか? このアクションを配置するためのより良い場所はありますか? これを行う従来の方法は何ですか?