2017-02-22 6 views
1

Ich bin sehr neu in Django und habe durch das Blog-Tutorial aus dem Buch: "Django by Example" gefolgt.Django Blogposts werden nicht zurückgegeben

Der folgende Code sollte alle Blogposts mit dem Status "published" zurückgeben, aber es funktioniert nicht. Die scheinbar korrekte Seite wird mit dem list.html-Code geladen, es werden jedoch keine Posts angezeigt. Ich habe es überprüft und ich erstelle Beiträge mit der Admin-Site, deren Status auf "published" gesetzt ist. Ich bin nicht sicher, ob das Problem mit dem Template, Modell, Ansichten oder URLs, damit ich sie alle hier bin auch:

Models.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'), 

Vorlagen 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 %} 
+1

Können Sie bitte Ihre URLS.py, die Vorlage, das Modell und die views.py in separate Boxen aufteilen? Es ist schwer zu sagen, welche Datei es ist. –

Antwort

1

Sie müssen Post.published.all() benutzen, um Ihre benutzerdefinierten Manager dann in Ihrem dict verwenden Sie mit einem Kapital P ‚Beiträge‘ tun Sie könnten Klein versuchen wollen, wie Ihre Ansicht ist mit posts. Dann war auch der Wert dafür eine Zeichenfolge anstelle der variablen Beiträge. So etwas wie dies sollte

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

Wow. Das war schnell. Es war der Großbuchstabe p, der es tat. Ich danke dir sehr. Die anderen Dinge waren, dass ich dumm war. Sie hatten Recht, bevor ich sie in unwissender Verwirrung LOL änderte. – Nick

+0

Großartig, kein Problem, froh, dass es geholfen hat! Ja, ich neige dazu, die Dinge viel zu bewegen, wenn ich versuche, auch etwas herauszufinden und dann über sie zu haha ​​ – davidejones

+0

@Nick Bitte akzeptieren Sie die Antwort, wenn es funktioniert hat. :) –

0

Sie sind in einem String als Kontextobjekt Daten übergeben:

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

werden muss,

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

Es auch noch nicht geht zu arbeiten, da Sie aus Ihrer Sicht haben und nicht die Manager-Methode aufrufen. Sie haben:

posts = Post.objects.all() 

Sie müssen Ihren Kundenmanager verwenden.

Verwandte Themen