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