为django提供多模式解决方案的包

django-stapler的Python项目详细描述


django订书机

Build Status

提供了组合多个ModelForm类的简单方法

说明

Django的ModelForm类允许您为模型创建一个表单类。这样可以方便地创建和更新模型实例。在某些特定情况下,不允许组合多个模型窗体,以便可以在一个视图中用一个窗体创建和更新多个模型实例。django订书机提供了这个功能

依赖性

Python 3.6Python 3.7Python 3.8

  • Django 2.2+

安装

pipinstalldjango-stapler

基本用法

将应用添加到设置.py在

^{pr2}$

像往常一样定义模型类

在模型.py在

fromdjango.dbimportmodels# Create your models here.classBike(models.Model):name=models.CharField(max_length=10)frame_type=models.CharField(max_length=10,blank=True,null=True)classManufacturer(models.Model):name=models.CharField(max_length=10)chief=models.CharField(max_length=10)

同时像往常一样声明ModelForm类,另外通过创建一个新的StapleForm类将ModelForm钉在一起。 在内部的Meta类中,将modelforms属性设置为tospikeModelForms的元组。在

在表单.py在

fromdjango.formsimportModelFormfromstapler.formsimportStaplerFormfrom.modelsimportBike,ManufacturerclassBikeModelForm(ModelForm):classMeta:model=Bikefields=['name','price']classManufacturerModelForm(ModelForm):classMeta:model=Manufacturerfields=['name','revenue']classStapledForm(StaplerForm):classMeta:modelforms=(BikeModelForm,ManufacturerModelForm)#auto_prefix = False, defaults is True

StapledForm生成一个包含四个字段的表单:bike__name, bike__price, manufacturer__name, manufacturer__revenue。 如果要保留原始字段名,可以将元类中的auto_prefix属性设置为False。 当模型之间的字段名冲突时,这可能会导致意外的行为。在

您可以在中使用StapledForm视图.py要一次性创建新的BikeManufacturer实例,请调用 form.save()。这将返回一个字典,其中的键类似于小写的模型类名,并带有_instance 后缀。这些键映射到新创建的实例:

在视图.py在

fromdjango.views.generic.editimportFormViewfrom.formsimportStapledFormclassSomeView(FormView):template_name='example.html'form_class=StapledFormsuccess_url='/thanks/'defform_valid(self,form):# This method is called when valid form data has been POSTed.# It should return an HttpResponse.result=form.save()nw_bike=result['bike_instance']# the saved bike instancenw_manufacturer=result['manufacturer_instance']# the saved manufacturer instancereturnsuper().form_valid(form)

您还可以通过向命名的instances参数提供实例的tuple来更新现有实例:

from.modelsimportBike,Manufacturerfrom.formsimportStapledForm...# inside view functionbike=Bike.objects.first()manufacturer=Manufacturer.objects.first()form=StapledForm(data=request.POST,instances=(bike,manufacturer))ifform.is_valid():result=form.save()result# this is a dictionary with the updated instances

StapledForm提供了pre_savepost_save挂钩。这些方法 在调用save()方法时,在保存实例之前和之后调用:

classStapledForm(StaplerForm):...defpre_save(self):print("did you get the memo?")defpost_save(self):print("have you seen my stapler?")

额外选项

除了modelforms属性之外,您还可以在Meta类中设置几个选项来改变StaplerForm的行为

  • auto_prefix:默认为True。这将在适当的字段中附加一个模型类名的前缀
  • required:所需的ModelForm类的元组。默认情况下,modelforms中定义的所有ModelForm类都是必需的。 如果ModelForm不在required属性中,它的错误将被忽略,is_valid()仍然可以返回True。 在本例中调用save()将只保存已验证的ModelForms的实例。None存储在返回的字典中,而不是实例

许可证

这个项目是在麻省理工学院的许可下授权的-参见许可证.md文件以获取详细信息

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

推荐PyPI第三方库


热门话题
java如何通过标记名检索多个标记中的元素以进行selenium自动化测试   java iText如何查找最后一行被拆分到下一页   java如何在hudson中的特定jdk上运行Findbugs和PMD?   如何确保java程序与java Environment 6兼容?   对形状进行分组,这样我就可以通过鼠标点击和java处理循环浏览它们   使用生成器映射对象时,java定义无效   maven Java:Struts2和IntelliJ供初学者使用   java子类不继承父类字段   java Android Grid View在Android版本kitkat上崩溃   java Hibernate从缓存返回错误的列表,即使预期的列表与缓存的列表不同   java SendGrid:模板和替换标记   用于普通生产者| Kafka流的java自定义分区器   安卓理解Java内部类中的作用域   无法从Android Studio中的非静态方法调用java非静态方法   比较两个XML响应的JavaXMLUnit   java使用keytool列出密钥   不使用Java客户端库将视频上传到YouTube数据API v3   java My While循环即使在满足条件时也不会结束   自动在外部存储字符串数据,以便以后在Java中使用