我正在尝试在我的模板中使用脆皮表单,但我无法在布局中正确呈现name
、id
和class
。 换句话说,我有以下模板:
<div class="modal-body">
<label for="conto">Conto</label>
<input class="form-control" id="form-conto" name="formConto"/>
</div>
所以我想删除输入行并添加脆皮字段,以便在输入字段上id="form-conto" name="formConto"
。
我知道我必须在我的Model.forms中添加布局,但我不明白如何获得它。
这是我的表格:
class MaterialeForm(forms.ModelForm):
class Meta:
model = Materiale
fields = "__all__"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
这是我的模型:
class Materiale(models.Model):
conto = models.ForeignKey(Conto, on_delete=models.CASCADE, null=True)
在模板顶部,加载脆皮标签:
{% load crispy_forms_tags %}
然后,告诉 Crispy 使用 Crispy 标签呈现您的表单:
<div class="modal-body">
{% crispy materialeform materialeform.helper %}
</div>
在您的forms.py
中,您需要添加一个Layout
:
from crispy_forms import FormHelper, Layout
...
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.layout = Layout(
Field('conta', id="form-conto", css_class="form-control", title="Conto")
)
请参阅布局:https://django-crispy-forms.readthedocs.io/en/latest/layouts.html 上的文档
然后,当对表单发出 GET 请求时,它将根据需要(或多或少(呈现。您可能需要调整一些内容。按照上面的布局文档进行操作。
但是,除非您在模板中实际传递表单,否则这些都不起作用。也许您已经在这样做了,例如,使用通用FormView
,但如果没有,以下是您在视图中需要的内容:
from .forms import MaterialeForm
from django.template import RequestContext
def materialeview(request, template_name):
materialeform = MaterialeForm()
# Form handling logic
[...]
return render_to_response(template_name, {'materialeform': materialeform}, context_instance=RequestContext(request))
在RequestContext
,请参阅 https://docs.djangoproject.com/en/3.0/ref/templates/api/#using-requestcontext。
有关脆皮形式的更多信息,请参阅 https://django-crispy-forms.readthedocs.io/en/latest/crispy_tag_forms.html。
最后,由于Crispy Forms在后台做了很多事情,你可以考虑通过告诉它大声失败来消除混乱。将其放入您的settings.py
文件中:
CRISPY_FAIL_SILENTLY = not DEBUG
顺便说一句,让我说,如果你还不太了解 Django 表单,Crispy Forms 可能会引起很多混乱。我会说先从 Django 的内置表单开始,然后在你想做更高级的事情时变得清晰。这里的文档应该会有所帮助:https://docs.djangoproject.com/en/3.0/topics/forms/。