Django-使用一个Comment模型为不同页面创建评论系统

时间:2020-05-16 16:04:40

标签: python html django

我正在尝试创建一个带有页面的网站,以提供有关不同城市的信息。在每个页面的底部,我希望有一个评论部分。我的想法是创建一个Comment模型,该模型将所有评论存储在一个地方,每个评论对象都有一个名为“ page”的字段,该字段告诉我应该在其上显示的页面。然后,我可以过滤掉所有注释,以便只显示正确页面的注释。

到目前为止,我已经创建了一个City模型,详细视图CityDetailView使用它来为每个城市创建一个页面。这很好用,并且对URL使用一个段标记。我创建了一个Comment模型,该模型接受:“内容”(描述城市),“ date_posted”,“ author”和“ page”,它们已通过外键连接到City模型。我认为此“页面”字段可用于存储评论写在哪个页面上,以便我可以使用{{ if comments.page == cites.name}}或city.html模板中的某些内容仅将评论显示在正确的页面上。

按照这种想法,我想我需要在CityDetailView内创建一个ListView来列出评论。这是正确的吗?我觉得有一个更好的方法可以做到,所以任何帮助将不胜感激。

这是相关代码,目前,城市页面未显示任何注释。我已经通过外壳手动添加了这些内容,两个测试页中的每一个都添加了一个。

views.py

from django.shortcuts import render
from django.views.generic import DetailView, ListView
from .models import Post, Comment, City, County


def home(request):
    return render(request, 'blog/home.html', {'title':'TIP Home'})   


class CityDetailView(DetailView):
    model = City
    template_name = 'blog/city.html'
    context_object_name = 'cities'

    class CommentsView(ListView):
        model = Comment
        context_object_name = 'comments'

urls.py

from django.urls import path
from . import views 
from .views import CityDetailView, CountyDetailView

urlpatterns = [
    path('', views.home, name='blog-home'),
    path('<slug>/', CityDetailView.as_view(), name='city-detail'),
]

models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.db.models.signals import pre_save
from django.utils.text import slugify

class City(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=250, null=True, blank=True)
    about = models.TextField()

    def __str__(self):
        return self.title

class Comment(models.Model):
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    page = models.ForeignKey(City, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.author)+'-'+str(self.page)+'-'+str(self.pk)        


def slug_generator(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = slugify(instance.title)

pre_save.connect(slug_generator, sender=City)

city.html

{% extends "blog/base.html" %}
{% load static %}
{% block content %}
    <div class="page_heading"><h1>{{ cities.title }}</h1></div>
    <p><center>{{ cities.about }}</center></p>


    {% for comment in comments %}

            <article class="media content-section">
              <div class="media-body">
                <div class="article-metadata">
                  <a class="mr-2" href="#">{{ comment.author }}</a>
                  <small class="text-muted">{{ comment.date_posted|date:'Y n d'  }}</small>
                </div>
                <p class="article-content">{{ comment.content }}</p>
              </div>
            </article>

    {% endfor%}


{% endblock content %}

1 个答案:

答案 0 :(得分:0)

覆盖get_context_data,然后可以访问相应页面段的所有注释。

class CityDetailView(DetailView):
    model = City
    template_name = 'blog/city.html'
    context_object_name = 'cities'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.get(page_slug=self.kwargs['slug'])

        return context