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