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

问题描述 投票:0回答:6

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

我有一个带有

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

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

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

python django forms
6个回答
3
投票

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


2
投票

我昨晚刚做的!

在 forms.py 中用 HiddenInput 小部件声明字段(一定要渲染它):

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

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

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

或使用 CBV:

initial = {'scope':'public'}


1
投票

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

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

1
投票

您可以覆盖 POST 数据。

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

1
投票

我能够在模板中做这样的事情并且成功了!

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

0
投票

我需要一个使用 GET args 填充但不显示输入字段的页面(以防止用户意外更改对象的配置),所以我在我的

admin.py
:

中这样做了
from django.contrib import admin
from django.forms import HiddenInput

from .models import SimpleNote

class SimpleNoteAdmin(admin.ModelAdmin):
    list_display = ("id",)

    def get_form(self, request, obj=None, change=False, **kwargs):
        form = super(SimpleNoteAdmin, self).get_form(request, obj, change, **kwargs)
        form.base_fields['content_type'].widget = HiddenInput()
        form.base_fields['object_id'].widget = HiddenInput()
        if "content_type" in request.GET and "object_id" in request.GET:  # simple note does not exist, so we must create it using GET parameters
            form.base_fields['object_id'].initial = request.GET['object_id']
            form.base_fields['content_type'].initial = request.GET['content_type']
        return form

admin.site.register(SimpleNote, SimpleNoteAdmin)
© www.soinside.com 2019 - 2024. All rights reserved.