如何添加要保存在Django ModelForm 中的ForeignKey 字段?

问题描述 投票:0回答:1

在创建我的网站时,我面临以下问题:用户可以添加文章,因此文章模型有一个 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创建的基础知识......

python django forms model
1个回答
0
投票

我相信你想使用 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)

这可能与如何将表单中的用户字段设置为当前登录的用户?

© www.soinside.com 2019 - 2024. All rights reserved.