如何在django表单中填充隐藏的必填字段?

时间:2017-10-25 20:41:14

标签: python django forms

我查看了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已填充在视图中,但因为我没有在模板中呈现它,所以我没有这样做。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以覆盖POST数据。

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

答案 3 :(得分:0)

我能够在模板中做到这样的事情并且有效!

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

答案 4 :(得分:0)

我昨晚做了这个!

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

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

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

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

或使用CBV:

initial = {'scope':'public'}