隐藏但需要 OneToOneField 的 Django 创建 ModelForm

Posted

技术标签:

【中文标题】隐藏但需要 OneToOneField 的 Django 创建 ModelForm【英文标题】:Django creation ModelForm with OneToOneField hidden but required 【发布时间】:2014-09-23 02:56:16 【问题描述】:

所以我有一个模型:

class MyThing(models.Model):
    my_field = OneToOneField(SomeOtherModel)

    ... other fields

表格:

class MyThingForm(forms.ModelForm):
    class Meta:
        model = MyThing

一个视图:

class MyThingView(views.TemplateView):
    template_name = 'thing.html'

    def get(self, request, *args, **kwargs):
        form = MyThingForm()
        return render(self.template_name, 'form': form)

    def post(self, request, *args, **kwargs):

        ... retrieve some_instance

        request.POST['my_field'] = some_instance
        form = MyThingForm(request.POST)

        if form.is_valid():
            form.save()
            return HttpResponseRedirect(...somewhere else)

        return render(self.template_name, 'form': form)

我的thing.html 模板:

% for field in form %
     field 
% endfor %

我的问题是:

我需要在渲染模板时隐藏 my_field 字段(但从后端),这意味着当我在 form 上执行 for 时> 在模板中,它不应该已经在字段中设置了 my_field 字段 这是一个创建表单,这意味着我没有现有的实例 在后端,my_field 是必需的,因此在执行 POST 时,我会从某处检索 my_field 的实例,无论在哪里,并将其添加到可见表单的数据中。在此之后,表单应该是有效的并且可以保存到数据库中

所以基本的问题是:如何使必填字段隐藏但可保存?

【问题讨论】:

【参考方案1】:

非常常见的用例请看this doc。

总而言之,您可以从表单中排除该字段并在从某处检索它后保存它。

更新代码为

class MyThingForm(forms.ModelForm):
    class Meta:
        model = MyThing
        exclude = ['my_field', ]

class MyThingView(views.TemplateView):

    ...
    def post(self, request, *args, **kwargs):

        form = MyThingForm(request.POST)
        #retrieved_my_field = retrieve the field

        if form.is_valid():
            inst = form.save(commit=False)
            inst.my_field = retrieved_my_field
            inst.save()
            return HttpResponseRedirect(...somewhere else)

        return render(self.template_name, 'form': form)

【讨论】:

以上是关于隐藏但需要 OneToOneField 的 Django 创建 ModelForm的主要内容,如果未能解决你的问题,请参考以下文章

Django OneToOneField、ManyToManyField、外键

在 ForeignKey 上设置 unique=True 与使用 OneToOneField 的效果相同

Django Python 3.x - 用ContentTypes覆盖OneToOneField的delete()。

Django 查询 - 将用户类与 Telegram Bot 的 OnetoOnefield 类连接起来

模型中的用户 OneToOneField

django 的 OneToOneField 和 django 的 OneToOneRel 的区别