Django 5 для начинающих

Прогресс по курсу:  9/1004

7.6 Улучшаем дизайн блога с использованием Bootstrap 5
7 из 7 шагов пройдено

Изменим нашу форму комментариев, а именно ее поля ввода. Для этого первым делом доработаем наш CommentForm в forms.py приложения blog:

class CommentForm(forms.ModelForm):
    name = forms.CharField(required=True,
                           widget=forms.TextInput(attrs={"class": "form-control", 'placeholder': 'Name'}))
    email = forms.EmailField(required=True,
                             widget=forms.EmailInput(attrs={"class": "form-control", 'placeholder': 'Email'}))
    body = forms.CharField(required=True, widget=forms.Textarea(attrs={"class": "form-control", 'placeholder': 'Text'}))

    class Meta:
        model = Comment
        fields = ['name', 'email', 'body']

Мы добавили в обработку формы поля name и email и к каждому полю мы добавили класс form-control, а также текстовую подсказку для пользователя в поле для ввода информации.

Проверим что у нас получилось:

Теперь давайте переработаем наш шаблон для добавления комментария, откроем comment_form.html и добавим следующий код:

<form action="{% url "blog:post_comment" post.id %}" method="post">
    {% csrf_token %}
    <div class="row">
        <h3>Add a new comment</h3>
        <div class="col mt-2">
            {{ form.name }}
        </div>
        <div class="col mt-2">
            {{ form.email }}
        </div>
        <div class="mt-2">
            {{ form.body }}
            <input type="submit" class="btn btn-primary mb-3" value="Add comment">
        </div>
    </div>
</form>

В данном шаблоне, мы выводим все поля формы отдельно, чтобы обернуть их в нужные стили. Проверим работу:


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Поделюсь, как можно не переопределять поля на форме ввода комментария - вместо этого в Meta задается словарь widgets.

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['name', 'email', 'body']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'}),
            'email': forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Email'}),
            'body': forms.Textarea(attrs={'class': 'form-control', 'placeholder': 'Текст комментария'}),
        }

Т.к. поля ничем другим не отличаются от заданных моделью, так тоже можно

Так же логично не спрашивать у авторизованного пользователя имя и Email - реализовал это ранее с помощью авторов.

comment_form.html (заодно кнопочку отодвинул от комментария):

<form action="{% url 'blog:post_comment' post.id %}" method="post">
    {% csrf_token %}

    <div class="row">
        {% if user.is_authenticated %}
            <h3>Add a new comment, {{ user.username }}</h3>
        {% else %}
            <h3>Add a new comment</h3>
            <div class="col mt-2">
                {{ form.name }}
            </div>
            <div class="col mt-2">
                {{ form.email }}
            </div>
        {% endif %}

        <div class="mt-2">
            {{ form.body }}
            <input type="submit" class="btn btn-primary mb-3 mt-2" value="Add comment">
        </div>
    </div>
</form>

В post_comment() view нужно добавить 3 строчки для присвоения полей имени и почты:

    comment = None
    # Комментарий был отправлен
    comment_post = request.POST.copy()

    if request.user.is_authenticated:
        comment_post['name'] = request.user.username
        comment_post['email'] = request.user.email

Работает так:

Изменен ilya kutaev

по моему 'placeholder': 'Enter search term...' в CommentForm надо заменить на : 'placeholder': 'Write your comment...', но у меня этот текст все равно не отображается в поле 'body'.

@Виктор_Русинович, он задаётся через настройки Summernote в файле settings.py:

@Дмитрий_Селезнев, Спасибо за ответ, получилось! Подскажите пожалуйста, как можно сделать кастомный текст 'placeholder' в полях summernote на страницах для написания комментария и к примеру нового поста? я попытался сделать так, но похоже должен быть какой то другой путь..

@Виктор_Русинович, скорее всего никак, без ковыряния в исходниках Summernote.

@Виктор_Русинович, нашёл такой способ.

В файл настроек добавляем:

SUMMERNOTE_CONFIG = {
    'summernote': {
        #
       'inheritPlaceholder': True
    },
}

И добавляем нужный плейсхолдер в forms.py:

... attrs={'class': 'form-control', 'summernote': {'placeholder': 'Enter text', ...

@Дмитрий_Селезнев, получилось, спасибо большое!

Только class CommentForm(forms.ModelForm), вроде, в файле forms.py

@Valentin_Sak, да, это действительно в файле forms.py, поправил, спасибо за помощь.

Чтобы в браузере получилось как на картинке, нужно в шаблоне comment_form div для body вытащить из div row и добавить ниже.

@Ольга_Миронова, сделайте пожалуйста скрин, и напишите какой браузер используется и его версия.

У меня выводится так-же как и в лекции, в ФФ и в Хроме, в коде ничего не менял.

Изменен Дмитрий Селезнев

@Ольга_Миронова, лучше отдельными строками добавить:

<form action="{% url "blog:post_comment" post.id %}" method="post">
    {% csrf_token %}
    <div class="row">
        <h3>Add a new comment</h3>
        <div class="col mt-2">
            {{ form.name }}
        </div>
        <div class="col mt-2">
            {{ form.email }}
        </div>
    </div>
    <div class="row">
        <div class="mt-2">
            {{ form.body }}
        </div>
    </div>
    <div class="row">
        <div class="mt-2">
            <input type="submit" class="btn btn-primary mb-3" value="Add comment">
        </div>
    </div>
</form>

@Дмитрий_Селезнев, спасибо. Сейчас еще раз перечитала код, поняла где ошибка( Утром выдернули на работу срочно, не хотела на пол-шаге останавливаться. Я в атрибут класс для body тоже col  добавила, и они все в строчку встали. Три раза перечитала - не увидела лишний col, опустила ниже и получилось. Сейчас разобралась, где ошибка. Только теперь я вообще запуталась с размещением) Я интерфейсы на qml пишу, и видимо мне надо потратить время, чтобы развернуть мозг в сторону html. Прошу прощения, что поторопилась.

У меня с новым стилем все h3  больше не полужирные. Шрифтов не хватает? 

@Ольга_Миронова, Странно, сейчас еще раз проверил, все точь-в-точь как на скриншотах.

@Илья_Перминов

@Илья_Перминов, Может, они все-таки полужирные? Завтра попробую сеть настроить, посмотрю, как в windows будет.

@Ольга_Миронова, скорее всего все нормально, у меня в сафари они более жирные.

@Илья_Перминов, спасибо. Похоже, да, сейчас подключилось с виндовс, и там намного приличнее выглядит, хотя не так красиво, как у Вас)) 

У меня шаблон для добавления комментария называется comment.html

@Ilia_Boiarintsev, должно быть два файла: comment.html и includes/comment_form.html, подробнее тут: https://stepik.org/lesson/973394/step/3?unit=980246

@Дмитрий_Селезнев, разобрался, спасибо. Просто сходу файл не нашел.