Отображение комментариев пользователя к сообщениям в Django - PullRequest
1 голос
/ 29 мая 2020

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

Вот модели .py

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    content = models.TextField(max_length=160)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.content

Вот views.py:

class PostDetailView(DetailView):
    model = Post
    template_name = "post_detail.html"

    def get_context_data(self, *args, **kwargs):
        context = super(PostDetailView, self).get_context_data()
        post = get_object_or_404(Post, slug=self.kwargs['slug'])
        comments = Comment.objects.filter(post=post).order_by('-id')
        total_likes = post.total_likes()
        liked = False
        if post.likes.filter(id=self.request.user.id).exists():
            liked = True

        if self.request.method == 'POST':
            comment_form = CommentForm(self.request.POST or None)
            if comment_form.is_valid():
                content = self.request.POST.get('content')
                comment = Comment.objects.create(
                    post=post, user=request.user, content=content)
                comment.save()
                return HttpResponseRedirect("post_detail.html")
        else:
            comment_form = CommentForm()

        context["total_likes"] = total_likes
        context["liked"] = liked
        context["comments"] = comments
        context["comment_form"] = comment_form
        return context


class PostCommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    fields = ['content', ]
    success_url = reverse_lazy('score:post-detail')

    def post(self, request, *args, **kwargs):
        form = CommentForm(request.POST)
        if form.is_valid():
            post = form.save()
            post.save()
        print(args, kwargs, request.POST)
        return redirect('score:post-detail', slug=kwargs['slug'])

вот шаблон

            <form action={% url 'score:post-comment' post.slug %} method="post" class="comment-form" action=".">
            {% comment %} <form method="post" class="comment-form" action="."> {% endcomment %}
            {% csrf_token %}
            {{ comment_form.as_p }}
            {% if request.user.is_authenticated %}
            <input type="submit" value="Submit" class="btn btn-outline-success">
            {% else %}
            <input type="submit" value="Submit" class="btn btn-outline-success" disabled> You must be Logged in to Comment
            {% endif %}
            </form>

вот форма

class CommentForm(forms.ModelForm):
    content = forms.CharField(label="", widget=forms.Textarea(
        attrs={'class': 'form-control', 'placeholder': 'Text goes here!!!', 'rows': '4', 'cols': '50'}))

    class Meta:
        model = Comment
        fields = ('content',)

1 Ответ

1 голос
/ 29 мая 2020

A CreateView определен для удаления большей части кода boilplate, поэтому вам не следует повторно реализовывать его в методе post, но пусть CreateView сделает свою работу.

Что вы здесь должны do переопределяет метод .form_valid(&hellip;) [Django -doc] и метод .form_invalid(&hellip;) [Django -doc] и метод .get_success_url(&hellip;) [Django -doc] для перенаправления на правильный вид:

from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.urls import reverse

class PostCommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    form_class = CommentForm

    def <b>form_valid</b>(self, form):
        <b>post</b> = get_object_or_404(Post, slug=self.kwargs['slug'])
        form<b>.instance.user = self.request.user</b>
        form<b>.instance.post = post</b>
        return super().form_valid(form)

    def <b>form_invalid</b>(self, form):
        return HttpResponseRedirect(self.get_success_url())

    def <b>get_success_url</b>(self):
        return reverse('score:post-detail', kwargs=dict(slug=self.kwargs['slug']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...