Django创建ModelForm,OneToOneField隐藏但需要

时间:2014-07-31 08:31:27

标签: django django-models django-forms django-templates django-views

所以我有一个模特:

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})

my thing.html模板:

{% for field in form %}
    {{ field }}
{% endfor %}

我的问题是:

  • 我需要在渲染模板时(但是从后端)隐藏 my_field 字段,这意味着当我在表单上执行 时>在模板中,它不应该在已经设置的字段中包含 my_field 字段
  • 这是一种创建形式,这意味着我没有现有实例
  • 在后端需要 my_field ,所以在执行 POST 时,我从某处检索 my_field 的实例,无所谓,并将其添加到视图中的表单数据中。在此之后,表单应该是有效的并且可以保存到数据库

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

1 个答案:

答案 0 :(得分:5)

通常用例查看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})