我正在尝试创建一个带有页面的网站,以提供有关不同城市的信息。在每个页面的底部,我希望有一个评论部分。我的想法是创建一个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 %}
答案 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