在django中同时处理多个表单的基于类的视图

django-shapeshifter的Python项目详细描述


#django shapeshifter

django中的一个常见问题是如何拥有一个视图,特别是一个可以同时显示和处理多个表单的基于类的视图。` django shapeshifter的目标是让这个问题变得更加简单。

为多个标准窗体或模型窗体提供视图类。要混合和匹配这些表单类型,您需要做一些额外的工作。以下是如何使用该软件包的方法:

您应该能够将提供的视图与项目中已经使用的大多数mixin一起使用,例如"loginRequiredMixin"。某些mixin可能需要重构,例如"successessagemixin",它是在"form_valid()"方法上触发的。

让我们看看如何使用具有以下几种标准格式的视图:

*interests/view s.py*
``python
来自django.url从shapeshifter导入reverse\lazy

导入表单



class interestformsview(multiformview):
form\u classes=(forms.contactform,forms.interestsform,forms.gdprform)
template\u name='interests/forms.html'
success\u url=reverse\u lazy('interests:thanks')
````

模板?视图的上下文将包含
一个新成员"form s",您可以遍历该成员以显示每个表单:


*interest/templates/interest/forms.html*
``html
{%extends'layout.html%}

{%block content%}
<;h3>;请在下面填写您的兴趣!<;h3>;

<;form method="post">;
{%csrf_token%}
{%for forms%}
{{form.as_p}
{%endfor%}
<;input type="submit"value="save"/>;
<;form>;
{%endblock content%}
```


这将在一个
单个`<;form>;`标记内连续生成一个包含所有三个表单的模板。**所有表单必须一起提交。**提交
后,django将用适当的提交数据填写每个表单,
验证它们,然后重定向到"success_url"。

要控制
,需要重写视图中的"forms\u valid"方法。下面是
可能的样子:

*interest s/views.py*
``python
class interestsformview(multiformview):

def forms_valid(self):
forms=self.get_forms()
contact_form=forms['contactform']
interest_form=forms['interestsform']
gdpr=forms['gdprform']


salesforce_client.send(zip(contact_form.data.items(),
interest_form.data.items())
return super().forms_valid()
````

上面的代码并不是一个完整的示例,但应该让您了解如何处理表单数据。




以上所有代码也适用于模型表单,只有一个例外。对于
模型表单,您将扩展
"multiformformview",而不是扩展"multiformformview"。这两个类之间有两个主要的区别,但最重要的区别是,forms_valid将在每个
表单上调用form.save()。下面是一个示例,允许用户在一个表单上编辑他们的"user``名字'"和"last`u name`",以及他们的第一个"profile``名字:

*my`u app/models.py*
`` python
from django.contrib.auth.models导入用户

on_delete=models.cascade)
```

*my_app/forms.py*
``python
from django.contrib.auth.models import user


from.models import profile

class userform(forms.modelform):
class meta:
model=user


fields=[
'名字',
'姓',
]



class profileform(forms.modelform):
class meta:
model=group
fields=[
'name',
]


labels={
'name':'配置文件名',
}
````

*my_app/views.py*
``python
来自shapeshifter.views从shapeshifter导入multimelformview
。mixins从.forms导入userform,profileform

类userupdateview(loginRequiredMixin,MultiSuccessMessageMixin,多模式窗体视图:
窗体类=(用户窗体,配置文件窗体)
模板名='我的应用程序/窗体.html'
成功URL=反向延迟('home')


def获取实例(self):
实例={
"用户窗体":self.request.user,
"profile form":profile_instance=profile.objects.filter(
user=self.request.user,
).first(),
}




没关系!您必须重写视图中的"form s_valid"来处理每个表单的
处理过程,但其他所有操作都应完全相同。

api

`multiformview`(和继承的"multiformelformview")扩展了django的
`templateview`。此外,它还为表单的实例化和
处理添加了一些方法。所有这些都可以被覆盖以自定义视图的行为。


应该是"dict"格式的
,格式如下:

``python
initial={
'contactform':{
'name':'katherine johnson'
}
}
````

*` form_classes=none`-form(或modelform,如果使用
`muldomelformview`)类的列表或元组。**不要实例化类,只需提供
名称**)。

*`success_url=none`-在表单都正确填写
后将用户重定向到的URL。这可以是URL或"反向延迟"实例。


\`-使用'kwargs'from
'get_form_kwargs'实例化每个表单,并将它们作为dict返回,键是表单类名的标准化版本。如果需要更改
窗体的实例化方式,请重写此项。

*`get_form_class_name(self,form_class)->;str`-将窗体的类
名称转换为小写字符串。` contactform将变成contactform。您可以
重写此项以为窗体提供不同的标准化名称。

*`get_form_kwargs(self,form_class)->;dict`-返回用于创建窗体的关键字的dict参数。用小写的类
名称作为每个表单的前缀,为表单提供任何"初始"参数,并且如果视图被
请求为"post"或"put",则为
表单提供"data"和"files"。对于"muldomelformview",此方法还提供是
窗体的"实例"。重写此方法以添加或更改窗体Kwargs。

*`validate_forms(self)->;bool`-calls`form.is_valid()`对于每个窗体,
返回整个窗体集的结果。如果
表单需要任何特殊的验证步骤,请重写此方法。

*`forms_valid(self)`-如果所有表单都通过验证,则调用此方法。在
"multiformview"中,此方法只需重定向到"success\u url"。对于基于模型的版本"muldomelformview",此方法在每个窗体上调用"form.save()",然后重定向。重写此方法以更改当窗体都有效时发生的情况。

*`forms_invalid(self)`-如果任何窗体的验证检查失败,则执行此
方法。默认情况下,它会重新呈现视图,显示带有错误的表单
。如果需要在并非所有表单都有效的情况下执行其他操作,则可以重写此方法。

在"muldomelformview"中处理一些事情的方式不同。

*`instances={}`-这个属性应该是一个dict,使用小写形式的类
名称作为键。值应该是表单使用的实例。

*`get_instances(self)`-返回'instances'的值。如果需要动态获取表单的实例,则覆盖此项。


`multisuccessMessageMixin`属性和方法

*`success_message=none`-包含要通过Django的消息框架添加的成功消息的字符串。


*` get_success_message(self)`-返回成功消息的方法。默认为self.success_message。

*`forms_valid(self)`-在添加成功消息后返回响应。

我们随时欢迎您的贡献,并将尽快对其进行评审(也就是说,我们都是有其他工作/职责的志愿者,因此可能需要一段时间)。

功能改变。一旦所有测试通过,您可以提交一个pull请求,其中包含您的更改、更改背后的基本原理,以及维护人员需要采取的任何特殊步骤来测试您的更改或复制您正在修复的bug。**请务必将您的姓名添加到以下贡献者列表中!**

那版本呢?

原始名称已被占用,因此必须找到新名称。由于这个
包处理多个表单,"shapeshifter"是一个很好的双关语(shapeshifters
可以有多种表单)。

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

推荐PyPI第三方库


热门话题
如何使用Netbeans在Java中创建可执行文件   swing Set不透明(真/假);JAVA   java JPA无法删除具有onotomany关系和cascatype all的实体   java Hibernate自参考映射难题   Java/从字符串到Java代码   java为什么我已经在取整了,却得到了一个无终止小数扩展?   java Wicket onsubmit信息对话框   java如何使用类、类加载器和URL获取资源   java在多模块项目中使用License Maven插件时出错   java HashSet“contains”方法是如何工作的?   图像JavaPNG显示为黑色   java如何在保持内容完整的同时在两个活动之间切换?   JAVA在Tomcat 7.0.27中,WAR无法为Prod正确解包   listview的java onclicklistener   JavaXPages托管Bean可以跨多个数据库工作吗?   java无法停止服务空对象引用错误Android   java将UTF8编码的字符串转换为人类可读的字符串   JavaSpring与JBossSAML的集成   java如何替换AuthorizationCodeInstalledApp类?