使用Crispy形式与ModelForm

问题描述 投票:18回答:1

我一直在遇到crispy form,它似乎完全符合我的要求:使用bootstrap布局渲染表单。

现在,这个例子谈论使用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。

现在,我可以用forms.Form替换ModelForm并使用Crispy form for 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类。现在:它有效,但是这样使用它是否正确?更新也以这种方式工作。

使用表单进行更新的正确方法是什么?

django django-models django-forms django-crispy-forms
1个回答
51
投票

我是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相关,而不是与脆皮形式有关。

稍后在您看来:

form = ExampleModelForm()

在您的模板中:

{% load crispy_forms_tags %}
{% crispy form %}
© www.soinside.com 2019 - 2024. All rights reserved.