如何在Django后台访问html元素ID?

2024-04-19 19:38:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习Django,目前正在构建博客应用程序。我有个问题。我构建了一些功能来添加新帖子和评论新帖子。现在,我正在努力创建删除用户评论的可能性。你知道吗

我将给定注释的id(主键)分配给按钮“delete”,该按钮出现在所有注释字段中,以便知道我要删除哪个注释。但现在我不知道如何在后端访问这个HTML元素并获取这个id

我的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 %}

我的基于类的视图视图.py我想触摸这个id的地方:

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。谢谢你的提示。你知道吗

我的型号.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})

Tags: fromselfidgetdatereturnmodelsdef
1条回答
网友
1楼 · 发布于 2024-04-19 19:38:54

首先,添加如下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请求时才会删除该对象,因此我们将在get中调用post方法,使其与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 %}

相关问题 更多 >