如何在Django中使用表单字段映射模型字段

时间:2012-05-04 06:44:47

标签: django django-models django-forms

我们有一个包含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'}

1 个答案:

答案 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