我们有一个包含models.py的应用程序,其中包含n个。继承基类的类。我们想要创建从用户n动态获取值的表单在db中保存但问题是我们想要使用django表单字段而不是django模型表单。
我们知道django表格中缺少一些字段,例如 PositiveIntegerField,CommaSeparetedIntegerFields 等。我们如何使用django表单字段实现此目的?
如果我们在shell中编写以下代码。
from djnago.db import models
mvar = models.PositiveIntegerFields()
from django import forms
fvar = forms.PositiveIntegerFields()
AttributeError: 'module' object has no attribute 'PositiveIntegerField'
forms.py
from django import forms
class ContextForm(forms.Form):
def __init__(self, rdict, *args, **kwargs):
super(ContextForm, self).__init__(*args, **kwargs)
for key in rdict.keys():
self.fields['%s' % str(key)] = getattr(forms,rdict.get(key))()
rdict = {'address': 'CharField','phone': 'CharField', 'Salary': 'PositiveIntegerField','first name': 'CharField','last name':'CharField'}
答案 0 :(得分:2)
查看源代码,所有字段都使用关键字参数调用默认表单字段:min_value
。
class PositiveIntegerField(IntegerField):
description = _("Positive integer")
def get_internal_type(self):
return "PositiveIntegerField"
def formfield(self, **kwargs):
defaults = {'min_value': 0}
defaults.update(kwargs)
return super(PositiveIntegerField, self).formfield(**defaults)
因此,您所寻找的仅仅是
from django import forms
fvar = forms.IntegerField(min_value=0)
fvar.clean(-1)
# ValidationError: [u'Ensure this value is greater than or equal to 0.']
至于CommaSeparatedIntegerField
,它看起来像传递了CharField
的{{1}}。
django.core.validators.validate_comma_separated_integer_list
所有这一切都是为了确保传入的字符串是f = forms.CharField(validators=[django.core.validators.validate_comma_separated_integer_list])
f.clean('1,2,3')
。该字段甚至没有进行任何python转换......如果只是验证表单输入,它似乎并没有真正节省很多时间。事实上,有一条评论说“可能转向贡献”。同意..
决定寻找乐趣。这是一个'^[\d,]+$'
生成器,用新字段覆盖模型字段......它还没有处理kwargs。这只是我能想到的第一种方法,而不是研究模型生成本身。它构造了一个常规的ModelForm
来修改表单/ after / initialization。
ModelForm