Django创建ModelForm,OneToOneField隐藏但需要

and*_*ari 3 django django-templates django-models django-forms django-views

所以我有一个模型:

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

    ... other fields
Run Code Online (Sandbox Code Playgroud)

表单:

class MyThingForm(forms.ModelForm):
    class Meta:
        model = MyThing
Run Code Online (Sandbox Code Playgroud)

一个看法:

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})
Run Code Online (Sandbox Code Playgroud)

我的thing.html模板:

{% for field in form %}
    {{ field }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 我需要隐藏my_field渲染模板时域(但是从后端),这意味着,当我做关于表单模板,它不应该有my_field在田里字段设置已经
  • 这是一种创建形式,这意味着我没有现有实例
  • 在后端my_field是必需的,所以在POST时我从某个地方检索my_field的实例,无论在哪里,并将其添加到视图中的表单数据中.在此之后,表单应该是有效的并且可以保存到数据库

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

Roh*_*han 5

通常用例看看这个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})
Run Code Online (Sandbox Code Playgroud)