Используйте хрустящую форму с ModelForm - программирование
Подтвердить что ты не робот

Используйте хрустящую форму с ModelForm

Я столкнулся с хрустящей формой, и, похоже, делает именно то, что мне нужно: визуализировать формы с макетом начальной загрузки.

Теперь в примере рассказывается об использовании 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.

Теперь, могу ли я заменить model.Form на ModelForm и использовать хрустящую форму для 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. Теперь: это работает, но правильно ли использовать его так? Обновление также работает таким образом.

Каков правильный способ использования форм для выполнения обновления?

4b9b3361

Ответ 1

Я ведущий разработчик django-crispy-forms. Я не уверен, что следую твоему вопросу, поскольку он немного плохо отформатирован. Что именно вы пытаетесь сделать?

django-crispy-forms работает с ModelForms, так же, как и с простыми формами. Он сидит на вершине Django, поэтому он не возится с ним. Он управляет только рендерингом формы, но не изменяет, как работает валидация, как создавать экземпляры форм и т.д.

EDIT:

Я добавляю пример о том, как сделать 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 %}