本文将告诉您Django如何对应表单字段的相应类,以及与Django表单相对应的知识点。我希望这对您有帮助。不要忘记收集此网站。
本文目录清单:
1.我如何使用django动态定义表单2。GAE试验Django表单验证框架,如何更改表单3的相应字段的标签,如何从数据库中读取数据,成为正式值形式。4. django表单返回字段valuecustomized第1节数据结构
最近的项目开发使用了这样的数据结构:
主要管理设备。
在下面,我列出了其简化的结构,没有更多,其余的只是多余的或锦上添花的:
设备分类的数据结构(相当于设备的大分类):
[python]查看普通副本
类别类别(Models.Model):
name = models.charfield(max_length = 40)
特定设备的数据结构:
[python]查看普通副本
班级设备(型号):
name = models.charfield(max_length = 100)
category = model.foreignkey(类别,相关_name=“ cg_equip_list”)
设备参数的数据结构:
[python]查看普通副本
类特征(Model.Model):
category = model.foreignkey(类别,相关_name=“ eq_characteristics”)
name = models.charfield(max_length = 40)
设备参数值的数据结构:
[python]查看普通副本
类特征值(Models.Model):
设备= models.Foreignkey(设备,相关_name=“ eq_characteric_values”))
特征= model.foreignkey(特征,相关_name=“ eq_key_values”)
Value = model.Charfield(max_length = 100)
也许很多人会问:为什么不将设备的参数直接定义为设备的数据结构?
我的答案是:这可以自己定义更多设备。
每个设备的参数不同,例如,计算机的参数基本上是:
CPU频率,内存大小,硬盘大小,显示类型,显示大小等。
打印机的参数可以是这样:
最大打印纸表面,打印机的类型等。
如何将具有不同参数的两个设备保存到数据库中?
根据上述问题,我们将需要建立两个表格,计算机表和打印机,这些表和打印机包含列中的相应参数。在这种情况下,如果有另一个设备,例如相机,我们将构建更多的数据表,并厌倦了维护数据库。
但是,根据参数和设备的分离,各种设备的参数以参数表的形式定义。
将特定设备参数的值放入参数值表中,您可以保存每个设备的参数。
在参数值的数据表中,哪个设备属于该设备,它主要根据设备的ID和参数的ID确定。
这样的表结构相对普遍。
更麻烦的是,当添加设备时,有必要增加其相应的参数值。它的参数不在设备表中,因此必须查询参数表:
在参数表中,设备分类ID =参数设备的设备分类ID是设备拥有的参数。
例如:
设备分类表中的数据:
ID名称
1台台式计算机
2打印机
参数将以下数据行保存在参数表中:
ID名称类别
1 CPU频率1
2 Mac地址1
3内存尺寸1
4显示大小1
5显示类型1
6硬盘尺寸1
7最大印刷表面2
您可以清楚地看到桌面计算机具有6个参数,并且打印机具有1个参数。
第2节解决方案部分
数据结构很清楚。当前问题如何输入这些参数的值?
困难是每个设备的参数数量不确定。因此,当定义形式时,我们无法修复固定形式的字段数量,只有动态数量增加或减少。字段数。
那么,如何动态生成不同数量的字段?
在这里,我的想法是,由于参数的数量存储在数据库中,因此必须查询数据库以动态生成。
那么,应该使用哪种特定方法来使用Django?
我自己尝试了很多方法,我慢慢发现了在调试过程中解决此问题的方法。
这样的过程是这样:
我开始解决的解决方案包括:
1.使用Ajax动态生成表单
2.在管理中使用该方法,使用内联方法,在添加一个设备时添加一些参数
3.使用表单集制作
4.使用FormTools中的FormWizard(Form向导)进行制作。
问题的困境是,参数值表中有2个外部键,因此做得不好。
我只是在前三种方法中尝试了它,一两天后,我放弃了。主要原因是:
1.ajax我仍然不是很熟悉。如果您想很好地使用它,则必须转向学习一些相关的JavaScript库。
2.内联InAdmin针对数据模型,并且增加的参数值相同。例如,可以将其添加到6个CPU参数中。它用于管理员,使用它来使用它非常麻烦。
3. Formset中的形式还需要相同的数据模型,但是您不能使用具有高键键的参数值表中的表单集,表单集。在简单的数据结构中将表单集输入数据中。
FormSet具有add_fields的函数。此功能更有用,但是形式没有此功能。简单地理解原理,即形式['field_name'] = forms.charfield()可以为表单实例添加字段。
我认为FormSet可以解决问题,但前提是,在构造表单集之前,我们必须知道,提前的formset中有几个参数值(也就是说,要知道某个分类设备有几个参数。表单,每种表单都使用不同的参数来初始化初始化)。)。
在页面中,首先添加设备的形式,因为设备的参数数量尚未固定,并且需要动态增加包含多个参数值表单的表单集,以便可以选择设备的参数。FormSet更适合使用固定个体的形式数量。因此,这增加了使用表单集的困难。如果要使用此方法,您仍然需要使用Ajax动态生成表单集。
FormSet需要在视图中初始化。
所以我没有使用这种方式。
我使用面向桌子的指导方式。
Django与FormTools的贡献,在使用它之后,使用它将很有用。我学会了一点点使用英语文件。感觉真的很方便。
但是,在4上方的解决方案的实施过程非常困难。三天后,我有点眉毛。
第3节具体实施
Django Univerectioner非常易于使用。
[python]查看普通副本
来自django.utils.translation importettext_lazy as _
从django导入表格
来自django.forms.formsets导入baseformset
来自django.forms.fields导入文件
来自django.forms.util导入验证eRROR
来自django.shortcuts导入render_to_response
来自django.contrib.formtools.wizard导入formwizard
来自ddtcms.office.equipment.models进口设备,特征,特征值
类设备形式(forms.modelform):
元类:
型号=设备
类特征valueform(forms.form):
def清洁(自我):
a = seld.fields
s = seld.data
self.clenet_data = {}
#以下段落从django的Full_Clean中复制
为了姓名,在self.fields.items()中字段:
#value_from_datadict()从数据字典中获取数据。
#每个小部件类型都知道如何返回自己的数据,因为有些
#小部件将数据划分为SEERAR HTML字段。
值= field.widget.value_from_datadict(self.data,self.files,self.add_prefix(name))
尝试:
如果IsInstance(字段,FileField):
初始= self.initial.get(name,field.initial)
value = field.clean(值,初始)
别的:
value = field.clean(value)
self.clenet_data [name] =值
如果hasattr(self,'clean_%s'%名称):
value = getttr(self,'clean_%s'%name)()()
self.clenet_data [name] =值
除了验证Error,E:
self._errors [name] = self.error_class(e.messages)
如果在self.clenet_data中名称:
del self.clenet_data [名称]
#cl = self.clenet_data
#debug()进行调试,检查Cl的值,主要是查看self.clenet_data的值。
返回self.clenet_data
类设备CreateWizard(formwizard):
def完成(self,request,form_list):
返回render_to_response('设备/DONE.HTML',,
{{{
'form_data':[form.clenet_data for form_list],
})
def get_form(self,step,data = none):
“为给定步骤返回表单实例的帮助方法。”
form = self.form_list [step](data,prefix = self.prefix_for_step(step),初始= self.initial.get(step,none))
如果步骤== 1:
如果数据:
cg = data.get('0类别',1)
cs = trunication.objects.all()。过滤器(类别__ID = CG)
对于CS中的C:
form.fields ['特征 - '+str(c.id)] = forms.charfield(label = c.name)
g = form.fields
#debug()
返回表格
#从wizard.py复制以更改它。
def渲染(自我,表单,请求,步骤,上下文=无):
“渲染给定的形式对象,返回httpresponse。”
old_data = request.post
prev_fields = []
如果old_data:
hidden = forms.hidendinput()
#从上述步骤中收集所有数据,并将其作为HTML隐藏归档。
对于我的范围(步骤):
old_form = self.get_form(i,old_data)
hash_name ='hash_%s'%i
prev_fields.extend([bf.as_hiddddddddddddddddddd()for bf in old_form]))))))))
prev_fields.append(hidden.render(has_name,old_data.get)
如果步骤== 1:
cg = old_data.get('0类别',1)
cs = trunication.objects.all()。过滤器(类别__ID = CG)
对于CS中的C:
form.fields ['特征 - '+str(c.id)] = forms.charfield(label = c.name)
g = form.fields
#debug()
如果步骤== 2:
debug()
返回超级(设备CreateWizard,Self)。渲染(表单,请求,步骤,上下文=无)
def get_template(self,step):
返回'设备/wizard_%s.html'%步骤
设备CreateWizard实际上可以放置在Views.py中,我认为这更合理。
在EquipmentCreateWizard中,我尝试修改Process_Step函数,但没有得到正确的结果。后来,我修改了get_form。我想从django的formtools的wizard.py复制,然后对其进行修改。
GET_FORM的修改没有得到正确的结果。后来,修改了渲染函数。在步骤2中,我显示了动态参数的数量。没有数据,它是一个空{},
因此,我再次重新修改了get_form函数,无非是判断它是否是第二步,然后在第二个表单中添加一些字段:
[python]查看普通副本
如果步骤== 1:
cg = old_data.get('0类别',1)
cs = trunication.objects.all()。过滤器(类别__ID = CG)
对于CS中的C:
form.fields ['特征 - '+str(c.id)] = forms.charfield(label = c.name)
g = form.fields
#debug()
此代码可在get_form和渲染中使用。两者都经过判断是否是第二步,然后根据步骤1中选择的设备的分类查询特定分类,然后根据分类获得分类设备。哪个参数,然后修改字段的参数数量根据参数数量。
“特征 - ”+str(c.id)用于保存将来的数据,拆分字符串,获取参数的ID,并保存特征-1,特征-2 ...中的值桌子。
g = form.fields
#debug()
它用于检查存在多少个参数,无论它是成功修改的。
Django的表单验证框架可以自动从数据模型中生成HTML表单,并且还可以在与数据存储区域进行交互时通过表单的形式无缝处理信息。在Google App Engine上使用Django表单,请参阅本文,请参阅此文章使用过程中的问题。例如,如果您定义了数据模型簿,则有两个字段名称,并且分别为pub_date分别表示标题和发布日期。如果您使用django表单自动生成书籍输入表单,则表格通常如下:名称:名称::酒吧日期:问题是将酒吧日期显示为更有意义的中国出版日期。如何实现?
长时间研究Django的正式文档中的表格。根本没有任何线索。你只能把狗放。尝试各种关键字组合后,搜索djangoforms.modeltltorm。
Django Modelform:在字段中添加别名
顺便说一句,收集堆栈溢出:一个为程序员的协作编辑的问答站点 - 无需平台或语言,它似乎非常专业。
第一个解决方案是使用本机Django方法:
最简单的方法是为数据库表创建模型。类似的特定方法。
1.设置settings.py的数据库连接方法。
2.在模型中设置数据库表的相应数据结构,该数据库表通常称为关系对象模型,因此称为模型,这是类。您可以使用django-addmin.py ... proce。似乎是这个命令。这是一个数据库检测命令,可以根据表自动生成模型代码。当然,如果您首先编写模型代码,则可以使用SynCDB命令来生成数据库表
3.在urls.py中设置URL路径。当浏览器访问此路径时,您可以在相应的视图中打开函数
4.看
4.1结果= modelclass.objects.all()此命令可以取出所有记录
4.2然后,您可以将结果直接传递到模板。模板示例。这是最合理的方法
4.3在模板中{for Result%的颜色%}
4.4 licols.field1/li
就是这样。可能太厚了。您可以看到教程。
我记得我没有环境,form.xx可以获得当前表单的值。您会看到,框中仍然保留的实际原理是传递form.xx form.xx.xx。出来后,它应该是字典。只是清空不必要的。如果您尝试一下,我会回去为您编写代码
引入形式字段和Django表单的相应类的引入已经结束。我想知道您是否从中找到了所需的信息?如果您想进一步了解此信息,请记住要收集对该网站的关注。