Как получить доступ к идентификатору html-элемента в бэкэнде django? - PullRequest
0 голосов
/ 22 декабря 2019

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

Я назначил идентификатор (первичный ключ) данного комментария кнопке «удалить», которая присутствует во всех полях комментариев, чтобы узнать, какой комментарий я хочуудалить. Но теперь я не знаю, как получить доступ к этим HTML-элементам в бэкенде и получить эти идентификаторы.

Часть моего html-файла:

{% for comment in comments %}
  {% if comment.post == object %}
    <div class="article-metadata">
        <small>{{ comment.add_date|date:"M/d/Y" }} <b>{{ comment.author }}</b></small>
          {% if comment.author == user %}
            <a href="#" class="btn btn-danger btn-sm mt-1 mb-1" id="{{ comment.id }}">Delete</a>
          {% endif %}
        <p>{{ comment.comm_content }}</p>
    </div>
  {% endif %}
{% endfor %}

Мое представление на основе классов в views.pyгде я хочу прикоснуться к этому идентификатору:

class PostDetailView(DetailView):
    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.all()[::-1]
        return context

    # In this function I want to access my comment id and remove this comment from database
    def delete_comment(self):
        post_to_delete = Post.objects.get(id=my_comment_id)
        del post_to_delete

Я знаю, что это можно решить каким-то образом с помощью jquery, но я не знаю javascript и сейчас я хотел бы знать, как это сделать, используя только python. Спасибо за любые подсказки.

Мой файл models.py:

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

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):
    comm_content = models.TextField()
    add_date = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

    def __str__(self):
        return f"Comment of post {self.post} posted at {self.add_date}."

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

1 Ответ

1 голос
/ 22 декабря 2019

Во-первых, добавьте шаблон URL, например:

# urls.py

path('comments/delete/<int:pk>/', views.CommentDeleteView.as_view(), name='delete_comment'),

, затем вам необходимо представление для обработки логики:

# views.py

from django.urls import reverse_lazy


class CommentDeleteView(DeleteView):
    model = Comment

    def get_success_url(self):
        return reverse_lazy('post-detail', kwargs={'pk': self.object.post.pk})

    # if you don't want to send POST request, you can use:
    def get(self, request, *args, **kwargs):
        return self.post(request, *args, **kwargs)

Универсальный Django DeleteView удалит только объектесли вы отправите ему запрос POST, то мы вызовем метод post в get, чтобы он работал с запросом GET;Хотя, вообще говоря, это не очень хорошая идея ;Вы должны добавить форму подтверждения (как модальный) и отправить оттуда POST.

и, наконец, для вашего шаблона:

{% for comment in comments %}
  {% if comment.post == object %}
    <div class="article-metadata">
        <small>{{ comment.add_date|date:"M/d/Y" }} <b>{{ comment.author }}</b></small>
          {% if comment.author == user %}
            <a href="{% url 'delete_comment' comment.id %}" class="btn btn-danger btn-sm mt-1 mb-1">Delete</a>
          {% endif %}
        <p>{{ comment.comm_content }}</p>
    </div>
  {% endif %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...