将 Crispy 表单与 ModelForm 一起使用
Posted
技术标签:
【中文标题】将 Crispy 表单与 ModelForm 一起使用【英文标题】:use Crispy form with ModelForm 【发布时间】:2012-10-17 10:17:53 【问题描述】:我遇到了crispy form,它似乎完全符合我的要求:使用引导布局呈现表单。
现在,该示例讨论使用forms.Form
。没关系,我可以通过编写这样的代码来创建我的:
class TemplateCreateForm(forms.Form):
title = forms.CharField(label=(u'Task name'))
description = forms.CharField(label=(u'Task description'))
url_start = forms.CharField(label=(u'Start page url'))
url_end = forms.CharField(label=(u'Final page url'))
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.form_method = 'post'
self.helper.add_input(Submit('submit', 'Submit'))
super(TemplateCreateForm, self).__init__(*args, **kwargs)
但是,如何进行更新?因为如果我把它放在视图中:
form = TemplateCreateForm(request.POST or None, instance=template)
它不起作用,因为实例仅适用于 ModelForm。
现在,我可以用ModelForm
替换forms.Form
并为ModelForm 使用脆的形式吗?
我这样做了
class TemplateCreateForm(ModelForm):
title = forms.CharField(label=(u'Task name'))
description = forms.CharField(label=(u'Task description'))
url_start = forms.CharField(label=(u'Start page url'))
url_end = forms.CharField(label=(u'Final page url'))
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.form_method = 'post'
self.helper.add_input(Submit('submit', 'Submit'))
super(TemplateCreateForm, self).__init__(*args, **kwargs)
class Meta:
model = Template
exclude = ('user')
在这里我添加了 Meta 类。 现在:它可以工作,但是这样使用它是否正确? 更新也以这种方式运行。
使用表单进行更新的正确方法是什么?
【问题讨论】:
【参考方案1】:我是 django-crispy-forms 的首席开发人员。我不确定我是否遵循您的问题,因为它的格式有点差。你到底想做什么?
django-crispy-forms 确实可以与 ModelForms 一起使用,与使用简单表单的方式相同。它位于 Django 之上,所以它不会弄乱它。它只控制你的表单渲染,但不会改变验证的工作方式,如何创建表单实例等等。
编辑:
我正在添加一个示例,说明如何使用香脆的表单创建 ModelForm
。
class ExampleModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ExampleModelForm, self).__init__(*args, **kwargs)
# If you pass FormHelper constructor a form instance
# It builds a default layout with all its fields
self.helper = FormHelper(self)
# You can dynamically adjust your layout
self.helper.layout.append(Submit('save', 'save'))
class Meta:
model = ExampleModel
我相信你的第一个问题是你继承了forms.Form
而不是forms.ModelForm
。这就是为什么我说你的问题是 Django 相关的,而不是crispy-forms 相关的。
稍后在你看来:
form = ExampleModelForm()
在您的模板中:
% load crispy_forms_tags %
% crispy form %
【讨论】:
我该怎么做才能将它与 ModelForm 一起使用? @maraujop:请看这个问题:***.com/questions/16581057/…这个问题是我在做这里所说的时候出现的。以上是关于将 Crispy 表单与 ModelForm 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
使用Ajax验证并提交Django表单(django-crispy-forms)
如何将 CreateView 与 ModelForm 一起使用
Django Crispy Forms 重新排列布局并保留 Bootstrap 内联格式?