удалять и изменять комментарии пользователей - PullRequest
0 голосов
/ 15 апреля 2020

Я добавил в свой комментарий к сообщению в блоге, теперь проблема в том, что я пытаюсь создать функцию удаления для этого, и у меня есть одна, но теперь, когда я вошел в систему, можно удалить все комментарии. Как я могу это исправить? Пользователь может удалять только свои комментарии ?? Самое смешное, что у меня есть эта функция в моих сообщениях, и она работает, и если я пытаюсь сделать то же самое в своих комментариях, то я получаю ошибку 404. Я пробовал несколько разных способов, но ничего не получилось. Ты моя единственная надежда:)

views.py

    from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.contrib.auth.models import User
from .models import Post, Comment
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from .forms import CommentForm
from django.contrib.auth.decorators import login_required





# Create your views here.

def home(request):
    context = {
        'posts': Post.objects.all()
    }
    return render(request, 'blog/home.html', context)


class PostListView(ListView):
    model = Post
    template_name = 'blog/home.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 5

class UserPostListView(ListView):
    model = Post
    template_name = 'blog/user_posts.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 5

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return Post.objects.filter(author=user).order_by('-date_posted')


class PostDetailView(DetailView):
    model = Post

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'content']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    fields = ['title', 'content']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False


class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Post
    success_url = '/'

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False


def about(request):
    return render(request, 'blog/about.html', {'title': 'About'})


@login_required
def add_comment_to_post(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.author = request.user
            comment.post = post
            comment.save()
            return redirect('post-detail', pk=post.pk)
    else:
        form = CommentForm()
    return render(request, 'blog/add_comment_to_post.html', {'form': form})

@login_required
def comment_remove(request, pk):
    comment = get_object_or_404(Comment, pk=pk)
    comment.delete()
    return redirect('post-detail', pk=comment.post.pk)

Models.py

    from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse


# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})



class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    author = models.CharField(max_length=30)
    text = models.TextField()
    created_on = models.DateTimeField(default=timezone.now)
    active = models.BooleanField(default=False)

    class Meta:
        ordering = ['-created_on']

    def approve(self):
        self.approved_comment = True
        self.save()

    def __str__(self):
        return self.text

post_detail

    {% extends "blog/base.html" %}
{% block content %}
    <article class="media content-section">
        <img class="rounded-circle article-img" src="{{post.author.profile.image.url}}">
        <div class="media-body">
            <div class="article-metadata">
                <a class="mr-2" href="{% url 'user_posts' object.author.username %}">{{ object.author }}</a>
                <small class="text-muted">{{ object.date_posted|date:"d F, Y" }}</small>
                {% if object.author == user %}
                    <div>
                        <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'post-update' object.id %}">Update</a>
                        <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'post-delete' object.id %}">Delete</a>
                    </div>
                {% endif %}
            </div>
            <h2 class="article-title">{{ object.title }}</h2>
            <p class="article-content">{{ object.content }}</p>
        </div>
    </article>
    <hr>
      <a class="btn btn-default" href="{% url 'add_comment_to_post' pk=post.pk %}">Add comment</a>
     {% for comment in post.comments.all %}
        {% if user.is_authenticated or comment.approved_comment %}
            <div class="comment">
                <div class="date">
                    <a class="btn btn-default" href="{% url 'comment_remove' pk=comment.pk %}">remove</a>
                </div>
                 <strong>{{ comment.author }}</strong> {{ comment.created_on|date:"d F, Y G:i" }}
                 <p>{{ comment.text|linebreaks }}</p>
            </div>
        {% endif %} 
    {% empty %}
    <p>No comments here yet :(</p>
{% endfor %}

{% endblock content %}

1 Ответ

0 голосов
/ 15 апреля 2020

Сначала сделайте автора в комментариях к модели внешнего ключа (пользователь). Затем в представлениях проверьте это условие:

if comment.author == request.user:
  comment.delete()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...