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

#django #django-views #django-templates #django-generic-views

#django #django-просмотры #django-шаблоны #django-generic-views

Вопрос:

Я создаю общий блог, изучая 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 приводит к следующему:

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

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


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

Ответ №1:

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

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

     <input
      class="form-class"
      type="text"
      placeholder="Article Title"
      name="{{ form.title.name }}"
      value="{{ form.title.value|default_if_none:'' }}"
    />
 

Комментарии:

1. Я могу принять свой ответ только через 2 дня, но считаю вопрос решенным.