2016-11-08 3 views
0

Ich benutze Django 1.8 und ich möchte Blog mit Slugs in URLs bauen. Aber mein Code funktioniert nicht.Slug in URL mit CBV in Django 1.8

Hier ist meine Vorlage mit Link Details schreiben:

{% extends "base.html" %} 
{% block head_title %}<title>Blog</title>{% endblock %} 

{% block content %} 
    <div class="container"> 
     <h2>Blog</h2> 
     {% for i in blog %} 
      <p><b>{{ i.date|date:"D, d M Y" }}</b></p> 

      <h4><a href="{% url 'projde:blogdetail' slug=i.slug %}">{{ i.title }}</a></h4> 
      <p>{{ i.text|truncatewords:100 }}</p> 
      {% if not forloop.last %} 
       <hr> 
      {% endif %} 
     {% endfor %} 
    </div> 
{% endblock %} 

Hier mein Modell ist:

class BlogPost(models.Model): 
    title = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=200, unique=True) 
    text = models.TextField() 
    date = models.DateTimeField() 
    is_online = models.BooleanField(default=False) 

    def __str__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse("blogdetail", kwargs={"slug": self.slug}) 

Hier sind alle meine Ansichten in meiner Anwendung, aber in diesem Fall ist das wichtigste der Letzte.

class Home(TemplateView): 
    template_name = "projde/index.html" 


class Projects(ListView): 
    template_name = "projde/projects.html" 
    context_object_name = "all_projects" 
    model = ProjectItem 

    def get_queryset(self): 
     return ProjectItem.objects.filter(is_online=True) 


class Resume(ListView): 
    template_name = 'projde/resume.html' 
    context_object_name = 'resume' 
    model = ResumeItem 

    def get_queryset(self): 
     return ResumeItem.objects.filter(is_online=True) 


class Blog(ListView): 
    template_name = "projde/blog.html" 
    context_object_name = "blog" 
    model = BlogPost 

    def get_queryset(self): 
     s = BlogPost.objects.all().order_by("-date") 
     return s 

class BlogDetail(DetailView): 
    model = BlogPost 
    template_name = "projde/blogdetail.html" 

und meine url:

urlpatterns = [ 
    url(r'^$', Home.as_view(), name="home"), 
    url(r'^projects/$', Projects.as_view(), name="projects"), 
    url(r'^resume/$', Resume.as_view(), name="resume"), 
    url(r'^blog/$', Blog.as_view(), name="blog"), 
    url(r'^blog/(?P<slug>\S+)$', BlogDetail.as_view(), name="blogdetail"), 
] 

Antwort

1

In der ListView Vorlage die Liste der Blog-Beiträge als blogpost_list verfügbar sein, wenn Sie nicht context_object_name gesetzt haben.

{% for blogpost in blogpost_list %} 
<p><b>{{ blogpost.date|date:"D, d M Y" }}</b></p> 
<h4><a href="{% url 'projde:blogdetail' slug=blogpost.slug %}">{{ blogpost.title }}</a></h4> 
{% endfor %} 

Da Sie context_object_name = 'blog' für Ihre Listenansicht festgelegt haben, sollten Sie die for-Schleife {% for blogpost in blogs %} oben ändern.

Wenn Sie immer noch den Fehler '{'slug': ''}' erhalten, schlägt dies vor, dass in Ihrer Datenbank ein Blogpost mit slug='' vorhanden ist. Beheben Sie dies über die Shell oder den Django-Administrator und aktualisieren Sie dann die Seite.

In der Vorlage DetailView benötigen Sie die for-Schleife nicht, und Sie können auf den Blogpost mit {{ blogpost }} zugreifen.

+0

Vielen Dank für die Hilfe, aber ich bekomme einen Fehler: ** Reverse für 'bloddetail' mit Argumenten '()' und Schlüsselwortargumente '{' slug ':' '}' nicht gefunden. 1 Muster versucht: ['blog/(? P \\ S +) $'] ** – mark

+0

Fertig, bitte überprüfen. – mark

+0

Welche URL verursacht den Fehler? Welche Vorlage zeigen Sie in Ihrer Frage an? – Alasdair