Джанго - Как просмотреть общие взгляды дочернего класса - PullRequest
0 голосов
/ 08 июня 2018

В основном я пытаюсь просмотреть все комментарии, сопровождаемые определенным сообщением

Это мои views.py

from django.views import generic

from .models import comment, article

class IndexView(generic.ListView):
    template_name = 'newspaper/newspaper.html'
    context_object_name = 'articles'

    def get_queryset(self):
        return article.objects.order_by('-date')


class ArticleDetailsView(generic.DetailView):
    template_name='newspaper/details.html'
    context_object_name = 'articles'

    def get_queryset(self):
        return article.objects.order_by('-date')


class CommentsDetailsView(generic.DetailView):
    template_name='newspaper/details.html'
    context_object_name = 'comments'

    def get_queryset(self):
        return comment.objects.all()

models.py

from django.db import models
from datetime import datetime

class article(models.Model):
    title= models.CharField(max_length=150)
    body= models.TextField()
    date= models.DateField()
    author= models.CharField(max_length=150, default='')

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


class comment(models.Model):
    main_article=models.ForeignKey('article',on_delete=models.CASCADE)
    text=models.TextField(default='Empty reply')
    date = models.DateTimeField(default=datetime.now, blank=True)
    def __str__(self):
        return self.text

urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)$',views.ArticleDetailsView.as_view(),name='articledetails'),
     url(r'^(?P<main_article_id>[0-9]+)$',views.CommentsDetailsView.as_view(),name='commentdetails'),

]

и, наконец, мой HTML-файл

{% extends "header.html" %}

{% block title %}
Article Details
{% endblock %}

{% block content %}
{% if articles %}

<div class="panel panel-primary">
    <div class="panel-heading">
    <h2>{{ articles.title}}  </h2>
    </div>
  <div class="panel-body">
    <h4>{{ articles.body}}  </h4>
  </div>
  <div class="panel-footer">
    <h5><i> Posted on: {{ articles.date}} </i> </h5>
    <h6 class="text-right"><i>By: {{articles.author}}</i></h6>
    </div>
</div>

<br>

<button class="btn btn-primary" type="button" >
  Replies <span class="badge">{{ comments.count }}</span>
</button>

{% for y in comments %}
<div class="well">
<h5>{{ y.text}}  </h5>
<h5><i>On: {{ y.date}}  </i></h5>
</div>
<br>
{% endfor %}
{% else %}
<div class="alert alert-danger" role="alert">There is no articles with the ID</div>

{% endif %}
{% endblock %}

Я простоначиная с общих представлений, и они причиняли мне боль в горле, но я чувствовал, насколько они сильны, я не уверен, что использование DetailView для раздела комментариев - идеальный случай для моей ситуации.

1 Ответ

0 голосов
/ 08 июня 2018

Перво-наперво: пожалуйста, укажите правильные имена для ваших классовВсе классы должны начинаться с заглавной буквы, поэтому вместо article вам нужно будет использовать Article.

Теперь, поскольку каждый комментарий будет принадлежать статье, я не думаю, что вам нужен отдельный DetailView для каждого комментария, но комментарии должны быть просто включены в ArticleDetailView.Кроме того, ваш ArticleDetailView не нуждается в наборе запросов с сортировкой;DetailView возвращает один объект, поэтому сортировка не требуется.Вот как это должно быть:

class ArticleDetailView(generic.DetailView):
    context_object_name = 'article'

Тогда у вас будет такой шаблон article_detail.html:

    {{ article.title}}
    {{ article.body}}
    ... etc I won't include everything
    and for the comments:

    {% for comment in article.comment_set.all %}
        {{ comment.text }} on {{ comment.date }}
    {% endfor %}

Это будет общая информация о каждой статье вместе с ее комментариями..

Наконец, если вы хотите больше узнать о представлениях на основе классов django, я написал очень подробное руководство @ https://spapas.github.io/2018/03/19/comprehensive-django-cbv-guide/

...