首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django博客-评论系统

Django博客-评论系统
EN

Stack Overflow用户
提问于 2021-05-31 19:21:45
回答 1查看 29关注 0票数 2

我是Django的新手,我想知道如何使用基于类的视图智能地链接评论和帖子系统。下面是我在“博客”应用中的“models.py”文件:

代码语言:javascript
运行
复制
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):
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = ['date_posted']

    def __str__(self):
        return '{} - {}'.format(self.author, self.date_posted)

这是我的'post_detail.html‘模板,它显示了特定的帖子,这里我只想在帖子下面显示所有评论:

代码语言:javascript
运行
复制
{% extends 'blog/base.html' %}

{% block content %}
    <article class="media content-section">
        <img class="rounded-circle article-img" src="{{ object.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:"F d, 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>
    <div>
        <strong><h2>Comments Section</h2></strong>
    </div>
{% endblock content %}

'views.py‘文件如下所示:

代码语言:javascript
运行
复制
from blog.forms import CommentForm
from django.db import models
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.mixins import UserPassesTestMixin
from django.contrib.auth.models import User
from django.shortcuts import redirect, render
from django.shortcuts import get_object_or_404
from django.views.generic import ListView
from django.views.generic import DetailView 
from django.views.generic import CreateView
from django.views.generic import UpdateView
from django.views.generic import DeleteView
from .models import Post
from .models import Comment


def home(request):
    context = {
        'title': 'Home',
        '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 = 7


class UserPostListView(ListView):
    model = Post
    template_name = 'blog/user_posts.html'
    context_object_name='posts'
    paginate_by = 7

    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


def comment(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.post = post
            comment.save()
            return redirect('post-detail', pk=post.pk)
        else:
            form = CommentForm()
    return render(request, 'blog/post_detail.html', {'form': form})


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'})

我知道所有的事情都应该在PostDetailView类中完成,但是我不知道如何开始。我将不胜感激任何想法或建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-31 19:27:47

您有一个从CommentPost的外键,所以如果您有一个Post对象,您可以使用post.comments.all()获取所有相关注释。

您可以直接在模板中执行此操作,只需省略括号即可。以下是用于说明的模板片段:

代码语言:javascript
运行
复制
<div>
    <strong><h2>Comments Section</h2></strong>
    <ul>
    {% for comment in object.comments.all %}
        <li>{{ comment }} {{ comment.context }}</li>
    {% endfor %}
    </ul>
</div>

这一类隐藏了数据库查询以获取模板中的注释。如果您更愿意在视图中执行查询,则可以覆盖PostDetailView.get_context_data()

类模型(DetailView):PostDetailView= Post

代码语言:javascript
运行
复制
def get_context_data(self, **kwargs):
    ctx = super().get_context_datat(**kwargs)
    ctx["comments"] = ctx["object"].comments.all()
    return ctx

在这种情况下,模板中的for循环将如下所示:

代码语言:javascript
运行
复制
{% for comment in object.comments.all %}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67772788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档