我有一个多次使用一个表单的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)
非常感谢!
答案 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/