【问题标题】:How do I populate a hidden required field in django forms?如何在 django 表单中填充隐藏的必填字段?
【发布时间】:2017-10-25 20:41:14
【问题描述】:

我在 Stackoverflow 上查看了其他类似的问题,但这些情况不适用于我。

我有一个带有Queue 字段的表单,该字段是必填字段。此表单用于多个地方,在一个这样的例子中,我不希望向用户显示 Queue 字段。所以,我根本没有在模板上渲染它。但是因为这是一个必填字段,所以表单不会提交。如何预先填充此字段,同时对用户隐藏它?

我无法更改模型或表单的保存方法,因为此表单也在其他地方使用。

forms.py

class PublicTicketForm(CustomFieldMixin, forms.Form):

    queue = forms.ChoiceField(
        widget=forms.Select(attrs={'class': 'form-control'}),
        label=_('Queue'),
        required=True,
        choices=()
    )

views.py:

def no_queue(request):

    if request.method == 'POST':
        form = PublicTicketForm(request.POST, request.FILES)
        form['queue'] = 9 # Tried to assign queue value to field, did not work

        if form.is_valid():
            if text_is_spam(form.cleaned_data['body'], request):
                # This submission is spam. Let's not save it.
                return render(request, template_name='helpdesk/public_spam.html')

            else:
                form.save()
    else:
        form = PublicTicketForm(initial={'queue': 9})  # tried this one too, did not work either
    return render(request, 'helpdesk/no_queue.html', {'form': form})

视图中填充了此表单的choices,但因为我没有在模板中呈现它,所以我没有这样做。

【问题讨论】:

  • 为什么需要它?
  • 因为在其他地方的用户应该可以选择他/她想要将表单信息放入哪个Queue,只有在这个地方我们才隐藏它并使其直接进入带有ID的Queue 9

标签: python django forms


【解决方案1】:

您可以使用表单集来分配特定值并向用户显示特定输入,例如this

【讨论】:

    【解决方案2】:

    不要设置隐藏字段。创建另一个不包含该字段的表单类(子类化将防止重复),然后在视图中设置值。

    instance = form.save(commit=False)
    instance.queue = 9
    instance.save()
    

    【讨论】:

      【解决方案3】:

      您可以覆盖 POST 数据。

      if request.method in ('POST', 'PUT'):
          data = request.POST.copy()
          data['queue'] = 9
          form = PublicTicketForm(data, request.FILES)
      

      【讨论】:

        【解决方案4】:

        我能够在模板中做这样的事情,而且效果很好!

        <input type="hidden" name="queue" value="9" />
        

        【讨论】:

          【解决方案5】:

          我昨晚刚做了这个!

          在 forms.py 中使用 HiddenInput 小部件声明该字段(一定要呈现它):

          scope = CharField(max_length=60,widget=HiddenInput())

          然后,在views.py中你可以应用初始值:

          form = MyForm(initial={'scope': 'public'})

          或使用 CBV:

          initial = {'scope':'public'}

          【讨论】:

          • 我无法将其隐藏在表单中,因为该表单也在其他地方使用,所以我能够做到 &lt;input type="hidden" name="queue" value="9" /&gt; 并且对我有用
          • 很高兴它正在工作。我之前没有想到的其他事情会过于子类化表单并在那里进行更改。对于 Django,我们有很多选择。
          猜你喜欢
          • 2014-09-22
          • 2019-01-03
          • 2011-03-29
          • 1970-01-01
          • 1970-01-01
          • 2012-08-11
          • 1970-01-01
          • 1970-01-01
          • 2017-08-23
          相关资源
          最近更新 更多