Django добавить секцию комментариев к ленте сообщений - PullRequest
5 голосов
/ 03 марта 2020

Я хочу поделиться проектом, который в настоящее время может создать пользователя, и каждый пользователь может создать N сообщений
Источник доступен на github

, и у меня есть две модели пользователей и пост
enter image description here

и слои шаблонов

enter image description here

В настоящее время фид для каждого сообщения имеет кнопка, которая отправляет комментарий к сообщению. Я хочу изменить это, чтобы поместить комментарии к сообщению, а не отправлять их по электронной почте, и каждый пользователь должен иметь возможность комментировать сообщение, а комментарий должен оставаться

{% block container %}
<body id="bg" img style="zoom: 85%; background-position: center center; background-attachment: fixed;background-repeat:no-repeat;padding:5px; background-image: url('{% static "/back.png"%}') ";>
<div style="background-image: url({% static 'static/img/back.png' %});">

    <div class="row" style="align:center">
        {% for post in posts %}
        <div class="col-sm-12 col-md-8 offset-md-4 mt-5 p-0 post-container,width:50%;">
            <div class="card" style="width: 32rem;width:50%;">
                <div class="card-body">
                    <div class="media pt-3 pl-3 pb-1">
                        <a href="{% url " users:detail" post.user.username%}">
                        <img alt="{{ post.user.username }}" class="mr-3 rounded-circle" height="35"
                             src="{{ post.profile.picture.url }}">
                        </a>
                        <h3 class="card-title">{{ post.title }}</h3>
                    </div>

                    <p class="card-text">{{ post.desc }}</p>

                </div>
            </div>
            <img alt="{{ post.title }}" src="{{ post.photo.url }}" style="width: 50%; heigth:60%">

            <div class="media-body">
                <b><p style="margin-top: 5px;">@{{ post.user.username }} - <small>{{ post.created }}</small>
                    &nbsp;&nbsp;
                    <a href="" style="color: #000; font-size: 20px;">
                        <i class="far fa-heart"></i>
                    </a>
                    <br>
                </p></b>


            </div>
            <!-- COMENT SECTION THAT I WANT TO IMPLEMENT MY FEATURE-->
            <form action="{% url 'posts:comment_new' %}" enctype="multipart/form-data" method="POST">
                {% csrf_token %}

                <input
                        class="form-control {% if form.title.errors %}is-invalid{% endif %}"
                        name="title"
                        size="16"
                        type="hidden"
                        value="{{post.title}}"
                >

                <input
                        class="form-control {% if form.title.errors %}is-invalid{% endif %}"
                        name="first_name "
                        size="16"
                        type="hidden"
                        value="{{user.first_name}}"
                >
                <input
                        class="form-control {% if form.title.errors %}is-invalid{% endif %}"
                        name="last_name "
                        size="16"
                        type="hidden"
                        value="{{user.last_name}}"
                >
                <textarea class="form-control" cols="50" name="comment" rows="5"
                          style="width:50%;" value="{{ comments.comment }}"></textarea>
                <button class="btn btn-outline-info btn-lg" style="width:35%; display:block;margin:auto;" type="submit">
                    Publish
                </button>

            </form>
        </div>
        <br>
        {% endfor %}
    </div>
</div>

{% endblock %}

Поскольку я сказал, что я хочу заменить этот вызов функции формы, чтобы создать раздел комментариев, вместо того, чтобы отправить электронное письмо с комментарием

< form action = "{% url 'posts:comment_new' %}">


def comment_new(request):
    if request.method == 'POST':
        message = request.POST['comment']
        subject = request.POST['title']
        user = request.POST['first_name']
        last_name = request.POST['last_name']
        # lastname = request.POST['lastname']

        send_mail("[MAIL] " + subject, user + " " + last_name + " said  " + message + " on http://url.com:8000",
                  'guillermo.varelli@gmail.com',
                  ['guillermo.varelli@gmail.com'], fail_silently=False)
    posts = Post.objects.all().order_by('-created')
    return render(request, os.path.join(BASE_DIR, 'templates', 'posts', 'feed.html'), {'posts': posts})

Я думаю, что это может быть создание комментария с пользователем и идентификатор публикации с подробным описанием комментария

def comment_new(request):
    if request.method == 'POST':   
        message = request.POST['comment']
        subject = request.POST['title']
        user = request.POST['first_name']
        last_name = request.POST['last_name']

        #lastname = request.POST['lastname']
        form = PostForm(request.POST, request.FILES)
        form.save()

Один из вариантов - создать комментарий

class Comment(models.Model):
    """
    #id= models.AutoField(max_length=1000, blank=True)

    # post = models.ForeignKey(Post, related_name='',on_delete=models.CASCADE,default=0)
    """

    #comment = models.ForeignKey('posts.Post', related_name='posts_rel', to_field="comments", db_column="comments",
     #                           on_delete=models.CASCADE, null=True, default=1, blank=True)
    post = models.IntegerField(blank=True,null=True,unique=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE,null=True)
    username = models.CharField(blank=True, null=True, unique=True ,max_length=200)
    comment = models.CharField(max_length=254, blank=True, null=True)

и затем форму

class CommentForm(forms.ModelForm):

    class Meta:
        """form settings"""
        model = Comment
        fields = ('user','username','post','comment',)

, наконец, с функция, которую я могу сохранить, но не могу отрендерить

form = CommentForm(request.POST, request.FILES)

# print formset.errors

if form.is_valid():
   form.save()

, но я не могу найти способ визуализации объекта в файле html

please feel free to suggest any solution or better create a pull request on the public git hub repo

1 Ответ

4 голосов
/ 05 марта 2020

В книге Django 2 по примеру мы можем найти пошаговое руководство по созданию системы комментариев , в которой пользователи смогут комментировать сообщения.

Для этого достаточно выполнить следующие четыре шага

  1. Создать модель для сохранения комментариев
  2. Создать форму для отправки комментариев и проверки правильности входные данные
  3. Добавить представление, которое обрабатывает форму и сохраняет новый комментарий в базе данных
  4. Измените шаблон сведений поста, чтобы отобразить список комментариев, и форму для добавления нового комментария

  1. Создание модели для сохранения комментариев

В своем файле models.py для приложения добавьте следующий код

class Comment(models.Model): 
    post = models.ForeignKey(Post,
                             on_delete=models.CASCADE,
                             related_name='comments')
    name = models.CharField(max_length=80) 
    email = models.EmailField() 
    body = models.TextField() 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    active = models.BooleanField(default=True) 

    class Meta: 
        ordering = ('created',) 

    def __str__(self): 
        return 'Comment by {} on {}'.format(self.name, self.post) 

Новая созданная вами модель комментариев еще не синхронизирована с базой данных. Выполните следующую команду, чтобы сгенерировать новую миграцию, которая отражает создание новой модели:

python manage.py makemigrations APPNAME

и

python manage.py migrate

После этого в базе данных появится новая таблица. Теперь откройте файл admin.py приложения блога, импортируйте модель Comment и добавьте следующий класс ModelAdmin:

from .models import Post, Comment

@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'post', 'created', 'active')
    list_filter = ('active', 'created', 'updated')
    search_fields = ('name', 'email', 'body')

Создайте форму для отправки комментариев и проверки входных данных

Отредактируйте файл forms.py в своем приложении блога и добавьте следующие строки:

from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'email', 'body')

Добавить представление, которое обрабатывает форму и сохраняет новый комментарий в базе данных

Отредактируйте файл views.py, добавьте импорт для модели Comment и формы CommentForm и измените подробный вид поста, чтобы он выглядел следующим образом:

from .models import Post, Comment
from .forms import EmailPostForm, CommentForm

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post,
                                   status='published',
                                   publish__year=year,
                                   publish__month=month,
                                   publish__day=day)

    # List of active comments for this post
    comments = post.comments.filter(active=True)

    new_comment = None

    if request.method == 'POST':
        # A comment was posted
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            # Create Comment object but don't save to database yet          
            new_comment = comment_form.save(commit=False)
            # Assign the current post to the comment
            new_comment.post = post
            # Save the comment to the database
            new_comment.save()
    else:
        comment_form = CommentForm()                   
    return render(request,
                  'blog/post/detail.html',
                  {'post': post,
                   'comments': comments,
                   'new_comment': new_comment,
                   'comment_form': comment_form})

Отредактируйте шаблон сведений о записи, чтобы отобразить список комментариев и форму для добавления нового комментария

На данный момент мы создали функциональность для управления комментариями к сообщению. Теперь нам нужно адаптировать наш шаблон post / detail. html для выполнения следующих задач: - Показать список комментариев - Показать форму для пользователей, чтобы добавить новый комментарий

Добавить следующие строки в post / detail. html шаблон для списка комментариев:

{% for comment in comments %}
  <div class="comment">
    <p class="info">
      Comment {{ forloop.counter }} by {{ comment.name }}
      {{ comment.created }}
    </p>
    {{ comment.body|linebreaks }}
  </div>
{% empty %}
  <p>There are no comments yet.</p>
{% endfor %}

Затем, для другого пункта, добавьте следующие строки:

{% if new_comment %}
  <h2>Your comment has been added.</h2>
{% else %}
  <h2>Add a new comment</h2>
  <form action="." method="post">
    {{ comment_form.as_p }}
    {% csrf_token %}
    <p><input type="submit" value="Add comment"></p>
  </form>
{% endif %}
...