【问题标题】:Django 1.10 doesn't show post from dbDjango 1.10 不显示来自 db 的帖子
【发布时间】:2017-05-05 22:33:54
【问题描述】:

我正在学习 django 框架,正在写博客。我在 django-admin 中添加了一些帖子,我想在网络上展示它们。

MODELS.PY

from django.db import models
from django.utils import timezone
from django.core.urlresolvers import reverse


class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager,
                     self).get_queryset()\
                    .filter(status='published')


class Post(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Roboczy'),
        ('publish', 'Opublikowany')
    )
    title = models.CharField(max_length=300)
    slug = models.SlugField(max_length=300, unique_for_date='publish')
    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=20,
                              choices=STATUS_CHOICES,
                              default='draft')
    object = models.Manager()
    published = PublishedManager()

    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.published.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 在 BLOG APP

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

urlpatterns = [

    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'),
]

URLS.PY(项目级)

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^blog/', include('blog.urls',
                         namespace='blog',
                         app_name='blog')),


]

list.html

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

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

{% block content %}
    <h1>Mój BLOG</h1>
    {% for post in posts %}
        <h2>
            <a href="{{ post.get_absolute_url }}">
                {{ post.title }}
            </a>
        </h2>
        <p>
            Opublikowane {{ post.publish }} przez {{ post.author }}
        </p>
        {{ post.body|truncatewords:30|linebreaks}}
    {% endfor %}
{% endblock %}

我不知道为什么这些帖子没有显示在 list.html 上。我认为错误在于 get_absolute_url。

【问题讨论】:

  • 了解您遇到的错误会很有用。它是否显示一个空白页面或一些与 django 相关的错误?
  • 请尝试创建一个minimal reproducible example,很明显您的问题与PublishManager 类或管理员的url 模式等无关
  • @AndreaConte 我有空白页。

标签: python django python-3.x


【解决方案1】:

网址格式错误。

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

根据视图,url 模式应该是:

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

另外,观点是错误的:

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

请注意,查询字段是 publish__year(不是 publish_year)、publish___month(不是 publish_month)和 publish__date(不是 publish_date)

完成这些更改后,get_absolute_url 也可以正常工作。 不知道你是想用Post.objects.all()还是Post.published.all()。理想情况下,它应该是Post.published.all(),因为通常只显示已发布的帖子。

【讨论】:

    【解决方案2】:

    好的,我必须更改 posts = Post.objects.all() 和 list.htlm

    <a href="{{ post.get_absolute_url }}">
    

    <a href="{{ posts }}">
    

    【讨论】:

      【解决方案3】:

      代替

      posts = Post.published.all()

      试试

      posts = Post.objects.all()
      

      【讨论】:

      • 如果我更改为对象我有错误不存在但是当我更改为对象我有这个错误
      • NoReverseMatch at /blog/ Reverse for 'post_detail' with arguments '(2016, '12', '20', 'post-numer3')' 和关键字参数 '{}' 未找到。尝试了 1 种模式:['blog/(?P\\d{4})/(?P\\d{2})/(?P\\d{2 })/$(?P[-\\w]+)/$']
      • 不,我认为我必须更改 post.get_absolute_url
      猜你喜欢
      • 1970-01-01
      • 2020-07-09
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      相关资源
      最近更新 更多