使用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

参考文献

待办事项

  • 更好的分析器错误消息

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaSwing:实现TableModel还是扩展AbstractTableModel?   无法在连接了SQL的Java中获取数据抛出结果集   java在运行jar时访问jar外部的prop文件   java如何在使用xPath时选择通过检查的节点,而不是它们的父节点。评估()   java如何将文本文件中的整数值翻两番?   java Update Hibernate给出了一个错误   如何使用Java在类中实现调用mule中onCall方法的Singleton?   java如何修复Hibernate 5的映射未找到异常?   调用AlertDialog。按下后退按钮时Android片段的Java生成器   java基于进度更改JProgressBar中的ColorUIResource   java如何让这个测试通过?   java是否可以在TestNG中对参数化测试进行依赖?   java查询无法通过HQL执行   Spring java 11获取spel问题EL1005E:找不到类型   尝试获取JMH锁时发生java异常