为django提供多模式解决方案的包
django-stapler的Python项目详细描述
django订书机
提供了组合多个ModelForm类的简单方法
说明
Django的ModelForm类允许您为模型创建一个表单类。这样可以方便地创建和更新模型实例。在某些特定情况下,不允许组合多个模型窗体,以便可以在一个视图中用一个窗体创建和更新多个模型实例。django订书机提供了这个功能
依赖性
- 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要一次性创建新的Bike
和Manufacturer
实例,请调用
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_save
和post_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文件以获取详细信息
- 项目
标签: