如何在Django中使用CreateView和crispy-forms

5

我希望在使用crispy-forms生成的布局时,能够与CreateView一起使用。然而,似乎我在forms.py中传递给self.helper的所有内容都被忽略了。

表单渲染得很漂亮,但是只有CreateView生成的字段 - 所有传递给Layout的字段都不见了。

我的views.py:

class MyView(CreateView):
    form_class = MyForm
    model = MyModel

    def form_valid(self, form):
        pass

我的forms.py:

from django.forms import ModelForm, Textarea
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout
from crispy_forms.bootstrap import FormActions

from .models import MyModel

class MyForm(ModelForm): 

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.form_method = 'POST'
        self.helper.add_input(Submit('submit', 'Submit'))
        self.helper.layout = Layout( 
            FormActions(Submit('BlahBlah', 'BlahBlah', css_class='btn-primary')))

    class Meta:
        model = MyModel
        fields = ['xxx', 'yyy']

我的 image_form.html:

{% load crispy_forms_tags %}
...
<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form|crispy }}
</form>

我还需要做什么才能使它工作?

我认为这里唯一的问题是,你应该使用{% crispy %}而不是form | crispy。请参考https://django-crispy-forms.readthedocs.io/en/latest/filters.html#using-crispy-tag-because-it-rocks - Zheng Liu
4个回答

18

我已经按照@user3316785的方法完成了它

我的CreateView看起来像这样:

class CreateDoktrinView(CreateView):
   model = Doktrin
   fields = ['name', 'description']

   def get_form(self, form_class=None):
       form = super().get_form(form_class)
       form.helper = FormHelper()
       form.helper.add_input(Submit('submit', 'Create', css_class='btn-primary'))
       return form

在模板中,我可以简单地使用:

 {% crispy form %}

3

我采用了不同的解决方案。

我按照以下方式更新了MyView:

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit

class MyView(CreateView):
    form_class = MyForm
    model = MyModel
    helper=None

    def form_valid(self, form):
        pass
    def __init__(self, *args, **kwargs):
        super(MyView, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_id = 'id-exampleForm'
        self.helper.form_class = 'blueForms'
        self.helper.form_method = 'post'
        self.helper.form_action = 'url_action_call'
        self.helper.add_input(Submit('submit', 'Save', css_class='btn-primary'))

    def get_context_data(self, **kwargs):
        context = super(MyView, self).get_context_data(**kwargs)
        context['helper'] = self.helper
        return context

这将在模板中添加以下内容,使您可以获得带有脆皮标签的整个表单:

{% load crispy_forms_tags  %}
{% crispy form helper %}

0

0

在这里,您必须使用模板标签 {% crispy form_name %}

注意:Crispy 过滤器在此处不起作用, 所以只需将 {{ form|crispy }} 替换为 {% crispy form %}


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接