怎么做到使用django动态定义表单的

怎么做到使用django动态定义表单的


守候你守候我
浏览 488回答 3
3回答

阿晨1998

您好,很高兴为您解答。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394from&nbsp;django.utils.translation&nbsp;import&nbsp;ugettext_lazy&nbsp;as&nbsp;_&nbsp;&nbsp;from&nbsp;django&nbsp;import&nbsp;forms&nbsp;&nbsp;from&nbsp;django.forms.formsets&nbsp;import&nbsp;BaseFormSet&nbsp;&nbsp;from&nbsp;django.forms.fields&nbsp;import&nbsp;FileField&nbsp;&nbsp;from&nbsp;django.forms.util&nbsp;import&nbsp;ValidationError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;django.shortcuts&nbsp;import&nbsp;render_to_response&nbsp;&nbsp;from&nbsp;django.contrib.formtools.wizard&nbsp;import&nbsp;FormWizard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;ddtcms.office.equipment.models&nbsp;import&nbsp;Equipment,Characteristic,CharacteristicValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;EquipmentForm(forms.ModelForm):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Meta:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model&nbsp;=&nbsp;Equipment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;CharacteristicValueForm(forms.Form):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;clean(self):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a=self.fields&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=self.data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.cleaned_data&nbsp;=&nbsp;{}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;下面的这一段for&nbsp;是从&nbsp;django的forms.py中的&nbsp;full_clean&nbsp;中复制来的&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;name,&nbsp;field&nbsp;in&nbsp;self.fields.items():&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;value_from_datadict()&nbsp;gets&nbsp;the&nbsp;data&nbsp;from&nbsp;the&nbsp;data&nbsp;dictionaries.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Each&nbsp;widget&nbsp;type&nbsp;knows&nbsp;how&nbsp;to&nbsp;retrieve&nbsp;its&nbsp;own&nbsp;data,&nbsp;because&nbsp;some&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;widgets&nbsp;split&nbsp;data&nbsp;over&nbsp;several&nbsp;HTML&nbsp;fields.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;field.widget.value_from_datadict(self.data,&nbsp;self.files,&nbsp;self.add_prefix(name))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;isinstance(field,&nbsp;FileField):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initial&nbsp;=&nbsp;self.initial.get(name,&nbsp;field.initial)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;field.clean(value,&nbsp;initial)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;field.clean(value)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.cleaned_data[name]&nbsp;=&nbsp;value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;hasattr(self,&nbsp;'clean_%s'&nbsp;%&nbsp;name):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;getattr(self,&nbsp;'clean_%s'&nbsp;%&nbsp;name)()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.cleaned_data[name]&nbsp;=&nbsp;value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;ValidationError,&nbsp;e:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._errors[name]&nbsp;=&nbsp;self.error_class(e.messages)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;name&nbsp;in&nbsp;self.cleaned_data:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;del&nbsp;self.cleaned_data[name]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#cl=self.cleaned_data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#debug()<<<调试用的,查看cl的值,主要是看self.cleaned_data的值,如果return了,就看不到了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self.cleaned_data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;EquipmentCreateWizard(FormWizard):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;done(self,&nbsp;request,&nbsp;form_list):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;render_to_response('equipment/done.html',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'form_data':&nbsp;[form.cleaned_data&nbsp;for&nbsp;form&nbsp;in&nbsp;form_list],&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_form(self,&nbsp;step,&nbsp;data=None):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Helper&nbsp;method&nbsp;that&nbsp;returns&nbsp;the&nbsp;Form&nbsp;instance&nbsp;for&nbsp;the&nbsp;given&nbsp;step."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;form&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;self.form_list[step](data,&nbsp;prefix=self.prefix_for_step(step),&nbsp;initial=self.initial.get(step,&nbsp;None))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;step&nbsp;==&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;data:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;data.get('0-category',&nbsp;1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Characteristic.objects.all().filter(category__id=cg)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;c&nbsp;in&nbsp;cs:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;form.fields['Characteristic-'+str(c.id)]&nbsp;=&nbsp;forms.CharField(label&nbsp;=&nbsp;c.name)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g=form.fields&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#debug()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;form&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;从wizard.py中复制过来进行更改的.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;render(self,&nbsp;form,&nbsp;request,&nbsp;step,&nbsp;context=None):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Renders&nbsp;the&nbsp;given&nbsp;Form&nbsp;object,&nbsp;returning&nbsp;an&nbsp;HttpResponse."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;old_data&nbsp;=&nbsp;request.POST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_fields&nbsp;=&nbsp;[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;old_data:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hidden&nbsp;=&nbsp;forms.HiddenInput()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Collect&nbsp;all&nbsp;data&nbsp;from&nbsp;previous&nbsp;steps&nbsp;and&nbsp;render&nbsp;it&nbsp;as&nbsp;HTML&nbsp;hidden&nbsp;fields.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;range(step):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;old_form&nbsp;=&nbsp;self.get_form(i,&nbsp;old_data)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash_name&nbsp;=&nbsp;'hash_%s'&nbsp;%&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_fields.extend([bf.as_hidden()&nbsp;for&nbsp;bf&nbsp;in&nbsp;old_form])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_fields.append(hidden.render(hash_name,&nbsp;old_data.get(hash_name,&nbsp;self.security_hash(request,&nbsp;old_form))))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;step&nbsp;==&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;old_data.get('0-category',&nbsp;1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Characteristic.objects.all().filter(category__id=cg)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;c&nbsp;in&nbsp;cs:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;form.fields['Characteristic-'+str(c.id)]&nbsp;=&nbsp;forms.CharField(label&nbsp;=&nbsp;c.name)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g=form.fields&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#debug()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;step&nbsp;==&nbsp;2:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;super(EquipmentCreateWizard,&nbsp;self).render(form,&nbsp;request,&nbsp;step,&nbsp;context=None)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_template(self,&nbsp;step):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'equipment/wizard_%s.html'&nbsp;%&nbsp;stepEquipmentCreateWizard其实也可以放在views.py中,而且我觉得更合理一点.在EquipmentCreateWizard 中,我试着修改过process_step 函数,但是得不到正确的结果,后来修改了get_form,都是想从django的formtools的wizard.py中复制过来再进行修改的.get_form的修改也没有得到正确的结果.后来就修改render函数,在第2步的时候,我将动态参数个数显示出来了.但是到最后结束done的环节,取得的formdata中,第二个form没有数据,就是一个空的{},于是我又重新修改get_form函数,无非就是判断是不是第二步,然后给第二个form动态添加几个field:1234567if&nbsp;step&nbsp;==&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;old_data.get('0-category',&nbsp;1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Characteristic.objects.all().filter(category__id=cg)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;c&nbsp;in&nbsp;cs:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;form.fields['Characteristic-'+str(c.id)]&nbsp;=&nbsp;forms.CharField(label&nbsp;=&nbsp;c.name)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g=form.fields&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#debug()这段代码在get_form和 render中都有,都是判断是不是第2步,然后就根据第1步中选择的设备的分类来查询到具体的分类,再根据分类来获取该种分类的设备有哪些参数,然后根据参数个数修改form的参数field的个数.'Characteristic-'+str(c.id)是用来以后保存数据的时候,split这个字符串,得到参数的id,并在参数值表中保存Characteristic-1,Characteristic-2...的value.g=form.fields#debug()用来断点查看参数field有多少个,是否修改成功.&nbsp;&nbsp;&nbsp;=========================123456789from&nbsp;django.conf.urls.defaults&nbsp;import&nbsp;*&nbsp;&nbsp;from&nbsp;ddtcms.office.equipment.forms&nbsp;import&nbsp;EquipmentForm,CharacteristicValueForm,EquipmentCreateWizard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;urlpatterns&nbsp;=&nbsp;patterns('ddtcms.office.equipment.views',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url(r'^$',&nbsp;'index',&nbsp;name="equipment_index"),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url(r'^add/$',&nbsp;'equipment_create',&nbsp;name="equipment_create"),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url(r'^add-by-wizard/$',EquipmentCreateWizard([EquipmentForm,&nbsp;CharacteristicValueForm]),&nbsp;name="equipment_create_by_wizard"),&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上代码,csdnbolg&nbsp;自动过滤了&nbsp;$符号,我加了上去,可能有不对的地方.==========================wizard_0.html12345678910111213141516{%&nbsp;block&nbsp;content&nbsp;%}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<h2>添加/修改设备向导</h2>&nbsp;&nbsp;&nbsp;<p>第&nbsp;{{&nbsp;step&nbsp;}}&nbsp;步,&nbsp;共&nbsp;{{&nbsp;step_count&nbsp;}}&nbsp;步.</p>&nbsp;&nbsp;&nbsp;<p>填写设备基本情况</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<form&nbsp;method="POST"&nbsp;action="">{%&nbsp;csrf_token&nbsp;%}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<table>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{&nbsp;form&nbsp;}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</table>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input&nbsp;type="hidden"&nbsp;name="{{&nbsp;step_field&nbsp;}}"&nbsp;value="{{&nbsp;step0&nbsp;}}"&nbsp;/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{&nbsp;previous_fields|safe&nbsp;}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input&nbsp;type="submit"&nbsp;value="Submit"&nbsp;/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</form>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;endblock&nbsp;%}===================wizard_1.html12345678910111213141516{%&nbsp;block&nbsp;content&nbsp;%}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<h2>添加/修改设备向导</h2>&nbsp;&nbsp;&nbsp;<p>第&nbsp;{{&nbsp;step&nbsp;}}&nbsp;步,&nbsp;共&nbsp;{{&nbsp;step_count&nbsp;}}&nbsp;步.</p>&nbsp;&nbsp;&nbsp;<p>填写设备参数,&nbsp;如果没有要填写的内容,&nbsp;请直接点击确定.</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<form&nbsp;method="POST"&nbsp;action="">{%&nbsp;csrf_token&nbsp;%}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<table>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{&nbsp;form&nbsp;}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</table>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input&nbsp;type="hidden"&nbsp;name="{{&nbsp;step_field&nbsp;}}"&nbsp;value="{{&nbsp;step0&nbsp;}}"&nbsp;/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{&nbsp;previous_fields|safe&nbsp;}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input&nbsp;type="submit"&nbsp;value="Submit"&nbsp;/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</form>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;endblock&nbsp;%}====================done.html12345678{%&nbsp;block&nbsp;content&nbsp;%}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<h2>添加/修改设备向导</h2>&nbsp;&nbsp;&nbsp;<p>您已经成功添加了一个设备.</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{form_data}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;endblock&nbsp;%}============还可以用另外的form来实现formwizard,就是第一个form1,主要用来让用户选择设备的分类,form2就根据前面的来动态生成参数的表单.原理是一样的.还有就是写2个view来模拟formwizard,第一个view增加一个设备,第二个view带设备id这个参数即可,可以很有效的增加设备的参数.&nbsp;

开心每一天1111

怎么做到使用django动态定义表单启动Python脚本Notepad++ Python脚本需要放置到特殊的目录中,以便于通过Python插件识别,然后可以在Notepad++中启动.通常这个目录是%APPDATA%\Notepad++\plugins\config\PythonScript。这个脚本也可以通过菜单Plugins->Python Script->Scripts启动.我们也可以创建工具栏按钮为这些脚本以便于快速启动它们。编程对统计字数为了展示这个插件,写一个python 脚本 ,用来计算 字符,字,行在当前的Notepad++编辑窗口。
打开App,查看更多内容
随时随地看视频慕课网APP