Создание пользовательского шаблона для 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:'' }}"
/>