【问题标题】:use Crispy form with ModelForm将 Crispy 表单与 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 类。 现在:它可以工作,但是这样使用它是否正确? 更新也以这种方式运行。

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

【问题讨论】:

    标签: django django-models django-forms django-crispy-forms


    【解决方案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 %}
    

    【讨论】:

    猜你喜欢
    • 2015-11-14
    • 2018-07-18
    • 1970-01-01
    • 2011-08-12
    • 2015-10-22
    • 2019-07-17
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多