【问题标题】:Django creation ModelForm with OneToOneField hidden but required隐藏但需要 OneToOneField 的 Django 创建 ModelForm
【发布时间】: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 的实例,无论在哪里,并将其添加到可见表单的数据中。在此之后,表单应该是有效的并且可以保存到数据库中

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

【问题讨论】:

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


    【解决方案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})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2014-01-21
      • 2013-03-25
      • 2014-05-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多