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