Создание пользовательского шаблона для CreateView и UpdateView с заполнителями и проверкой ошибок

Я делаю обычный блог, пока изучаю Django.

У меня есть ArticleCreateView и ArticleUpdateView, и я пытаюсь сделать пользовательский шаблон, который бы разделял оба представления. Насколько я понимаю, CreateView и UpdateView по умолчанию используют один и тот же шаблон (article_form.html), который я и пытаюсь изменить.

У меня есть следующее в моем models.py:

class Article(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    # def __str__ ...
    # def get_absolute_url ...

В моем файле views.py:

class ArticleCreateView(CreateView):
    model = Article
    fields = ['title', 'body']      
    template_name = 'article_form.html'


class ArticleCreateView(CreateView):
    model = Article
    fields = ['title', 'body']
    template_name = 'article_form.html'

В моем шаблоне article_form.html работает следующее:

<form method='post'>
  {{ form.as_p }}
  <button>
    Publish
  </button>
</form>

Я хочу сделать его более навороченным, с большим количеством CSS, и упрощенная версия такова:

<form method='post'>
  {% csrf_token %}
  <fieldset class="fieldset-class">
    {{ form.title.errors }}
    <input
      class="form-class"
      type="text"
      placeholder="Article Title"
      name="{{ form.title.name }}"
      value="{{ form.title.value }}"
    />
  </fieldset>
  <fieldset class="form-group">
    {{ form.body.errors }}
    <textarea
      class="form-control"
      rows="8"
      placeholder="Article Body"
      name="{{ form.body.name }}"
    >{{ form.body.value }}</textarea>
  </fieldset>
</form>

Мне нужна форма, которая:

  • имеет заполнители в пустых полях (вместо меток)
  • имеет проверку ошибок на основе модели (max_length соблюдается и оба поля становятся required без моего указания)
  • не стирает введенные значения при отправке

Приведенный выше html делает следующее:

  • при отправке с пустыми полями будут возникать ошибки, а все введенные значения будут сохраняться (хорошо)
  • .
  • пустые поля имеют None вместо заполнителей (проблема)

Замена object.title и object.body на form.title.value и form.body.value в приведенном выше html делает следующее:

  • при отправке с пустыми полями будут возникать ошибки, но также будут стираться введенные значения (проблема)
  • пустые поля имеют правильные заполнители (хорошо)

Я прочитал документацию Встроенные шаблонные теги и фильтры, Вывод полей вручную, Вывод сообщений об ошибках формы, Вывод полей формы, и Attributes of BoundField, искал похожий код на SO и GitHub, читал исходник, предоставленный {{ form.as_p }}, но не нашел простого решения, несмотря на якобы общий случай использования.

Единственное, что я могу придумать, это запихнуть везде утверждения {% if %}, чтобы выбирать между placeholder и value, или получить какую-нибудь стороннюю либу вроде crispy-forms, но мне кажется, что должно существовать более питоническое решение.

Как всегда, я нашел ответ сразу после размещения вопроса на SO.

Встроенный фильтр шаблонов default_if_none решает проблему:

    <input
      class="form-class"
      type="text"
      placeholder="Article Title"
      name="{{ form.title.name }}"
      value="{{ form.title.value|default_if_none:'' }}"
    />
Вернуться на верх