在创建我的网站时,我面临以下问题:用户可以添加文章,因此文章模型有一个 ForeignKey 字段 - author。
我创建了一个用于添加它的表单,继承自ModelForm,因为我认为这种方式更符合逻辑(因为它直接与数据库交互)。问题是我无法将此字段添加到表单中,因为它无法填写;它必须从请求本身获取。
author = request.user.pk
那么我怎样才能让表单也保存作者ID呢?如果没有它,就会出现错误:
NOT NULL CONSTRAINT FAILED
,这是合乎逻辑的,因为表单不保存 pk,因此它为 null;但 FOREIGN KEY
不能为空。
唯一的办法就是继承类Form?我真的不想这样做...我正在考虑 “重写”方法
save()
,以便它还有一个参数 - 作者 id:
form.save(author=request.user.pk)
这样就可以了。但我改变了主意,因为如果出现问题,这会弄乱整个数据库......
save()
方法太全局了。更重要的是,很可能有另一种方法来解决我的问题,这种方法更有效、更清晰。
这是我的表单的代码:
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ['title', 'content']
widgets = {'title' : TextInput(attrs={'class' : 'create_article_title',
'placeholder' : 'Enter the heading...' }),
'content' : Textarea(attrs={'class' : 'create_article_content',
'placeholder' : 'Your article...' })}
还有我的模型:
class Article(Model):
title = CharField(max_length=30)
content = CharField(max_length=5000)
author = ForeignKey(User, on_delete=CASCADE)
rating = IntegerField(default=0)
created = DateField(auto_now_add=True)
last_updated = DateField(auto_now_add=True)
articles = ArticleManager()
objects = Manager()
以及我的观点:
class AddArticle(View):
template_name = 'myapp/addarticle.html'
def get(self, request):
context = {'add_article_form' : ArticleForm()}
return render(request, self.template_name, context=context)
def post(self, request):
form = ArticleForm()
form.save()
return redirect('index')
看来我完全误解了ModelForm创建的基础知识......
我相信你想使用 FormView 并做这样的事情:
class AddArticle(FormView):
form_class = ArticleForm
template_name = 'myapp/addarticle.html'
success_url = 'index'
def get(self, request, *args, **kwargs):
context = {'add_article_form' : ArticleForm()}
return render(request, self.template_name, context=context)
def form_valid(self, form):
form = form.save(commit=False)
form.user = self.request.user
form.save()
return redirect(self.success_url)