使用dsl定义、生成和验证自定义表单的django模型字段
django-param-field的Python项目详细描述
Django模型字段,使用DSL定义、生成和验证, 自定义表单。
paramfield允许您存储如下内容:
width: Decimal -> max:50.0 min:5.0 height: Decimal -> max:40.0 min:3.0 painted : Bool-> default:False inscription: Text-> max_length:30
并根据需要生成django等价形式:
fromdjangoimportformsclassCustomForm(forms.Form):width=forms.DecimalField(max_value=50,min=5)height=forms.DecimalField(max_valur=40,min=3)painted=forms.BooleanField()inscription=forms.CharField(max_length=30)
这对于创建用户定义的表单或自定义每个模型非常有用 形式。
要求
它已在
- Python3
- Django 1.9,1.10
安装
从存储库中
$ git clone https://github.com/secnot/django-param-field $ python setup.py install
或者来自pypi
$ pip intall django-param-field
用法
将param_字段添加到已安装的应用程序
# settings.pyINSTALLED_APPS=[...'param_field',]
将字段添加到模型:
# models.pyfromdjang.dbimportmodelsfromparam_fieldimportParamField,ParamDictclassCustomProduct(models.Model):name=models.CharField(max_length=44)...params=ParamField(blank=True,max_length=3000)
现在您有了一个工作模型来创建一个新实例 参数写入:
params=""" width: Dimmension-> max:50.0 min:5.0 height: Dimmension-> max:40.0 min:3.0"""CustomProduct.objects.create(name='Custom wooden box",params=params)
以及从模型生成窗体的窗体视图
# views.pyfromdjango.shortcutsimportrender,get_object_or_404fromdjango.views.genericimportFormViewfromdjangoimportformsfrom.modelsimportCustomProductclassCustomProductFormView(FormView):template_name='product_form.html'form_class=forms.Formdefdispatch(self,request,*args,**kwargs):"""Find requested CustomProduct it's needed both in post and get requests so the form can be genereted"""pk=self.kwargs['pk']self.product=get_object_or_404(CustomProduct,pk=pk)returnsuper().dispatch(request,*args,**kwargs)defget_context_data(self,**kwargs):"""Send product info to template"""context=super().get_context_data(**kwargs)context['product']=self.productreturncontextdefget_form(self,form_class=None):"""Generate form form param_field"""# NOTE: params.form(...) will return None when it doesn't# containt any field.returnself.product.params.form(**self.get_form_kwargs())defform_valid(self,form):"""Do what ever you want with the form, at this point it's a validated django form like any other"""custom_parameters=form.cleaned_data...
再读一遍blog post 教程,包括如何处理文件和图像的示例 领域。
语法
每个paramfield可以有一个或多个具有以下语法的字段
fieldname: type-> property: value
- fieldname-一个小写名称,以字母开头,后跟 通过字母、数字和/或下划线。默认最大名称长度 是30个字符。
- type-支持的字段类型之一(都以
大写)
- 布尔
- 十进制
- 亮度
- 整数
- 文本
- text区域
- 文件
- 图像
- property-字段支持的一个或多个属性
键入后跟值。
- 全部:隐藏。必需,标签,帮助文本
- bool:默认值
- 整数:默认、偶数、奇数、最大、最小、选项
- 十进制:默认值、最大值、最小值、选项、最大位数、最大小数
- 文本:默认,最大长度,最小长度,选项
- text区域:默认,最大长度
- 文件:(不支持隐藏)
- 图像:(不支持隐藏)
- value-属性支持的值类型之一
左
- 布尔值-真/假
- 十进制-1.33,6.44
- 整数-44
- 字符串-“string with scape”chars“”
- 值列表-[值,值,值]
配置
字段属性的绝对限制可以通过 {STR 1 } $设置。P< <强>,例如^ {STR 1 } $ PARAMIMPITEMAX < /强>控制最大值 integermax属性的允许值,因此创建一个新整数 max较大的字段将失败。
这些选项的默认值为:
# settings.py# Max lengths for label and help_text stringsPARAM_LABEL_MAX_LENGTH=40PARAM_HELP_TEXT_MAX_LENGTH=200PARAM_NAME_MAX_LENGTH=30# Max and Min integer values, these have been chosen so integers don't cause# problems when stored in any DBPARAM_INT_MAX=2147483647PARAM_INT_MIN=-2147483648# The maximum number of digits allowed and the max decimal placesPARAM_DECIMAL_MAX_DIGITS=20PARAM_DECIMAL_MAX_DECIMALS=4# Decimal max and min (must have valid number of digits/decimals)PARAM_DECIMAL_MAX=Decimal("9999999999999999.9999")PARAM_DECIMAL_MIN=Decimal("-9999999999999999.9999")# Dimmension digits/decimalsPARAM_DIMMENSION_MAX_DIGITS=12PARAM_DIMMENSION_MAX_DECIMALS=4# Dimmension max and minPARAM_DIMMENSION_MAX=Decimal("99999999.9999")PARAM_DIMMENSION_MIN=Decimal("0.0")# Text/TextArea max lengthPARAM_TEXT_MAX_LENGTH=300# max_length used by ParamField when it isn't suppliedPARAM_FIELD_MAX_LENGTH=3000
测试
将应用程序添加到settings.py后,您可以使用以下命令运行测试:
$ python manage.py test param_field
待办事项
- 更好的分析器错误消息