【问题标题】:Django blog posts not being returned没有返回 Django 博客文章
【发布时间】:2017-07-12 20:27:40
【问题描述】:

我对 Django 非常陌生,并且一直在阅读书中的博客教程:“Django by Example”。

下面的代码应该返回所有状态为“已发布”的博客文章,但它拒绝工作。使用 list.html 代码加载似乎正确的页面,但没有显示任何帖子。我已经仔细检查过,我正在使用状态设置为“已发布”的管理站点创建帖子。我不确定问题是否出在模板、模型、视图或 URL 上,所以我将其全部包含在这里:

模型.py:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.template.defaultfilters import slugify
from django.core.urlresolvers import reverse

#Data model class for creating posts table enrties in database

#Custom manager. Limits returned querysets to ones with published status
class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager, self).get_queryset()\
    .filter(status='published') #super used to call get_queryset method from parent class as it is currently being
                                #overridden here.

class Post(models.Model):
    STATUS_CHOICES = (('draft', 'Draft'), ('published', 'Published'),)
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')    #A field for use in building urls
    #slug = models.SlugField(slugify(title))
    author = models.ForeignKey(User, related_name='blog_posts') #Each post written by a user and a user can write many posts
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')

    objects = models.Manager() #The default manager
    published = PublishedManager() #Custom manager

    class Meta:
        ordering = ('-publish',)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail', args=[self.publish.year, self.publish.strftime('%m'),self.publish.strftime('%d'), self.slug])

views.py:

from django.shortcuts import render, get_object_or_404
from .models import Post


def post_list(request):
    posts = Post.objects.all()
    return render(request, 'blog/post/list.html', {'Posts': 'posts'})

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post, status='published', publish__year=year, publish__month=month, publish__day=day)
    return render(request, 'blog/post/detail.html', {'post':post})

URLs.py

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

urlpatterns = [
    # post views
    url(r'^$', views.post_list, name='post_list'),
    url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/'\
        r'(?P<post>[-\w]+)/$', views.post_detail, name='post_detail'),

模板base.html:

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
        <link href="{% static "css/blog.css" %}" rel="stylesheet">

</head>
<body>
    <div id="content">
        {% block content %}
        {% endblock %}
    </div>
    <div id="sidebar">
        <h2>My Site site</h2>
            <p>This site is all about me</p>
    </div>
</body>
</html>

detail.html:

{% extends "blog/base.html" %}

{% block title %}My Blog{% endblock %}

{% block content %}
    <h1>Blog</h1>
    {% for post in posts %}
    <h2>
        <a href="{{ post.get_absolute_url }}">
            {{ post.title }}
        </a>
    </h2>
    <p class="date">Published{{ post.publish }} by {{ post.author }}</p>
    {{ post.body|truncatewords:30|linebreaks }}
    {% endfor %}
{% endblock %}

【问题讨论】:

  • 您能否将您的 URLS.py、模板、模型和views.py 分成单独的框?很难分辨是哪个文件。

标签: python django


【解决方案1】:

您需要使用 Post.published.all() 来使用您的自定义管理器,然后在您的 dict 中使用大写 P 进行“帖子”,您可能想尝试使用小写字母,因为您的视图使用的是 posts。然后它的值也是一个字符串而不是变量帖子。所以这样的事情应该可以工作

def post_list(request):
    posts = Post.published.all()
    return render(request, 'blog/post/list.html', {'posts': posts})

【讨论】:

  • 哇。那很快。是大写的 p 正在这样做。太感谢了。其他的事情是我很愚蠢。在我在无知的混乱中更改它们之前,它们是正确的 LOL。
  • 太好了,没问题,很高兴它有帮助!是的,当我也想弄清楚一些事情时,我倾向于移动很多东西然后忘记它们哈哈
  • 答案太快了,我不会马上接受?
【解决方案2】:

你传入一个字符串作为你的上下文对象数据:

return render(request, 'blog/post/list.html', {'Posts': 'posts'})

需要

return render(request, 'blog/post/list.html', {'Posts': posts})

它仍然无法工作,因为您在视图中并且没有调用管理器方法。你有:

posts = Post.objects.all()

您需要使用您的客户经理。

【讨论】:

    【解决方案3】:

    我找到了答案——数据库中的所有帖子都处于“草稿”状态,并且在 PublishedManager 中注册了 status='published'。更改 status=''draft" 一切都会好起来的!

    【讨论】: