您可以在一个视图中多次使用 Django 表单吗?

kdu*_*ubs 1 forms django

我有一个多次使用一种形式的 Django 视图。该表单只是一个布尔字段表单,应该初始化为True但用户可以决定是否取消选中这些框。

我遇到的问题是,无论用户检查什么,所有字段都评估为True。这是多次使用相同表单的问题,还是我搞砸了其他事情?

表格如下所示:

class DataTypeForm(forms.Form):
def __init__(self,*args,**kwargs):
    section_label = kwargs.pop('section_label')
    initial_value = kwargs.pop('initial_value')

    super(DataTypeForm,self).__init__(*args,**kwargs)
    self.fields['dataType'].label=mark_safe(section_label)
    self.fields['dataType'].initial=initial_value
    self.fields['dataType'].required=False

dataType = forms.BooleanField(required=False)
Run Code Online (Sandbox Code Playgroud)

这是视图:

def Manual_Request(request):

  form_dict = {}
  arg_dict = {}
  message = message = {'last_url':'Nominal_Request'}

  if request.method == 'POST':
    logger.info("Query submitted, beginning query results render for:")

    form_NOM = DataTypeForm(request.POST or None,section_label="ENG_NOM",initial_value=True)
    form_DDM = DataTypeForm(request.POST or None,section_label="SCI_DDM",initial_value=True)
    form_RAW = DataTypeForm(request.POST or None,section_label="SCI_RAW",initial_value=False)

    if form_NOM.is_valid():
        NOM = form_NOM.cleaned_data['dataType']

        arg_dict.update({'ENG_NOM':str(NOM)})
        logger.info("ENG_NOM: {val}".format(val=NOM))

    if form_DDM.is_valid():
        DDM = form_DDM.cleaned_data['dataType']

        arg_dict.update({'SCI_DDM':str(DDM)})
        logger.info("SCI_DDM: {val}".format(val=DDM))

    if form_RAW.is_valid():
        RAW = form_RAW.cleaned_data['dataType']

        arg_dict.update({'SCI_RAW':str(RAW)})
        logger.info("SCI_RAW: {val}".format(val=RAW))

    return Request_Results(request,args_dict)

  else:
    logger.info("Rendering query page")

    form_NOM = DataTypeForm(section_label="ENG_NOM",initial_value=True)
    form_DDM = DataTypeForm(section_label="SCI_DDM",initial_value=True)
    form_RAW = DataTypeForm(section_label="SCI_RAW",initial_value=True)
    form_dict.update({'form_NOM':...etc})

  return render(request,'InterfaceApp/COMMRequest_Manual.html',form_dict)
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助!

Bre*_*ser 5

我还没有运行你的代码,但我最好的猜测是,是的,在同一个视图中多次使用同一个表单是一个问题。原因?您的所有<input type="checkbox" name="..." ... />标签都将具有相同的名称'dataType'. 用户的浏览器对您的后端一无所知,例如,dataType=on&dataType=on如果选中两个字段而一个未选中,则只会发送三个字段的 POST 数据。

看到这里的问题了吗?django 应该如何知道哪些dataType字段用于您的 NOM、DDM 或 RAW 表单?它不可能知道。

您应该能够使用表单前缀来解决这个问题。简而言之,您可以将一个 kwarg 传递给表单__init__(),这将导致将前缀添加到呈现的 HTML 中的所有表单项。因此,例如:

form_NOM = DataTypeForm(request.POST or None, section_label="ENG_NOM", 
                        initial_value=True, prefix="NOM")
form_DDM = DataTypeForm(request.POST or None, section_label="SCI_DDM",
                        initial_value=True, prefix="DDM")
form_RAW = DataTypeForm(request.POST or None, section_label="SCI_RAW", 
                        initial_value=False, prefix="RAW")
Run Code Online (Sandbox Code Playgroud)

希望有帮助!