我有一个多次使用一种形式的 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)
非常感谢帮助!
我还没有运行你的代码,但我最好的猜测是,是的,在同一个视图中多次使用同一个表单是一个问题。原因?您的所有<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)
希望有帮助!