我正在尝试在模板中使用Crispy Forms,但无法获得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 Forms不太了解,那么Crispy Forms可能会引起很多混乱。我想说的是先从Django的内置Forms开始,然后在您想做更多高级工作时变得酥脆。这里的文档应该可以帮助您:https://docs.djangoproject.com/en/3.0/topics/forms/。