Django и хрустящая форма, как добавить идентификатор и имя в хрустящем макете - PullRequest
2 голосов
/ 30 мая 2020

Я пытаюсь использовать 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)

1 Ответ

2 голосов
/ 30 мая 2020

Вверху вашего шаблона загрузите хрустящие теги:

{% 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 создан для формы, он будет отображаться (более или менее) по вашему желанию. Возможно, вам придется настроить некоторые вещи. Следуйте приведенным выше документам по макету, чтобы попасть туда.

Но ничего из этого не сработает, если вы не передадите форму в шаблоне. Возможно, вы уже делаете это, например, с generi c 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 .

Подробнее о Crispy Forms см. https://django-crispy-forms.readthedocs.io/en/latest/crispy_tag_forms.html.

Наконец, поскольку Crispy Forms много делает в фон, вы можете подумать об устранении путаницы, громко сказав ему сбой. Поместите это в свой settings.py файл:

CRISPY_FAIL_SILENTLY = not DEBUG

В стороне, позвольте мне сказать, что Crispy Forms, вероятно, вызовет много путаницы, если вы еще не понимаете Django Forms хорошо. Я бы посоветовал начать сначала со встроенных форм Django, а потом становиться хрустящими, когда вы захотите делать более сложные вещи. Здесь должны помочь документы: https://docs.djangoproject.com/en/3.0/topics/forms/.

...