你能在一个视图中多次使用Django表单吗?

时间:2015-07-02 21:42:18

标签: django forms

我有一个多次使用一个表单的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)

这是观点:

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)

非常感谢!

2 个答案:

答案 0 :(得分:3)

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

在这里看到问题? django如何知道哪些dataType字段适用于您的NOM,DDM或RAW表单?它无法知道。

您应该可以使用form prefixes解决此问题。简而言之,有一个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")

希望有所帮助!

答案 1 :(得分:0)

这正是Django formsets的用途。它们允许您创建一组相同类型的表单。它处理前缀,并添加一个管理表单,以便Django不会混淆什么数据来自什么形式。

https://docs.djangoproject.com/en/1.8/topics/forms/formsets/