#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 дня, но считаю вопрос решенным.