2015-06-16 1 views
0

У меня есть блог django, над которым я работаю, и у меня есть первая часть блога, в которой в блоге отображаются различные записи из базы данных. Однако, когда я нажимаю на конкретный пост в блоге, он не перенаправляет меня на подробный вид, он просто перенаправляет меня обратно в блог, где я могу видеть все записи в блоге:Блог Django, не связанный с подробным просмотром

Нажав на это в blog.html Я хочу, чтобы связать с конкретной должности в post.html

<h2><a href="{% url 'entry_detail' slug=object.slug %}">{{ object.title }}</a></h2> 

urls.py из django.conf.urls импорта шаблонов, URL с. просмотров импорта, накорми

urlpatterns = patterns(
    '', 
    url(r'^feed/$', feed.LatestPosts(), name="feed"), 
    url(r'^', views.BlogIndex.as_view(), name="blog"), 
    url(r'^entry/(?P<slug>\S+)$', views.BlogDetail.as_view(), name="entry_detail"), 
) 

models.py

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


class Tag(models.Model): 
    slug = models.SlugField(max_length=200, unique=True) 

    def __str__(self): 
     return self.slug 


class EntryQuerySet(models.QuerySet): 
    def published(self): 
     return self.filter(publish=True) 


class Entry(models.Model): 
    title = models.CharField(max_length=200) 
    author = models.CharField(max_length=200, null=True) 
    body = models.TextField() 
    slug = models.SlugField(max_length=200, unique=True) 
    publish = models.BooleanField(default=True) 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 
    tags = models.ManyToManyField(Tag) 
    SHIRT_SIZES = (
     ('S', 'Small'), 
     ('M', 'Medium'), 
     ('L', 'Large'), 
    ) 
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES, null=True, blank=True) 
    objects = EntryQuerySet.as_manager() 

    def __str__(self): 
     return self.title 

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

    class Meta: 
     verbose_name = "Blog Entry" 
     verbose_name_plural = "Blog Entries" 
     ordering = ["-created"] 

views.py

from django.views import generic 
from . import models 


class BlogIndex(generic.ListView): 
    queryset = models.Entry.objects.published() 
    template_name = "blog.html" 
    paginate_by = 3 


class BlogDetail(generic.DetailView): 
    model = models.Entry 
    template_name = "post.html" 

blog.html

{% include 'head.html' %} 
{% include 'navbar.html' %} 

<div class="container"> 

{% load django_markdown %} 
<br> 
<br> 
{% for object in object_list %} 
    <div class="post"> 
    <h2><a href="{% url 'entry_detail' slug=object.slug %}">{{ object.title }}</a></h2> 

     <p class="meta"></p> 

     <p class="meta"> 
      {{ object.created }} | 
      Tagged under {{ object.tags.all|join:", " }} 
     </p> 
     {{ object.body|markdown }} 
    </div> 
{% endfor %} 

    <hr class="featurette-divider"> 


{% if is_paginated %} 
      <ul class="pager"> 
       <li {% if not page_obj.has_previous %}class="disabled"{% endif %}><a {% if page_obj.has_previous %}href="?page={{ page_obj.previous_page_number }}"{% endif %}>Prev</a></li> 
       <li {% if not page_obj.has_next %}class="disabled"{% endif %}><a {% if page_obj.has_next %}href="?page={{ page_obj.next_page_number }}"{% endif %}>Next</a></li> 
      </ul> 
{% endif %} 

    </div> 
{% include 'footer.html' %} 

post.html

{% load django_markdown %} 

{% for object in object_list %} 

    <div class="post"> 
    <h2><a href="{% url "entry_detail" slug=object.slug %}">{{ object.title }}</a></h2> 

    <p class="meta"> 
     {{ object.created }} | 
     Tagged under {{ object.tags.all|join:", " }} <p> Created by 
     {{ object.author }} </p> 
    </p> 
    {{ object.body|markdown }} 
    </div> 

У меня также есть еще один url.py, который указывает URL-адрес блога на все URL-адреса в приложении для блога. Не знаю, если это помогает:

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


urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^$', 'website.views.home', name='home'), 
    url(r'^about/', 'website.views.about', name='about'), 
    url(r'^contact/', 'contact.views.contact', name='contact'), 
    url(r'^markdown/', include("django_markdown.urls")), 
    url(r'^blog/', include('blog.urls')), 
] 
+0

Что выводит этот тег шаблона URL-адреса при проверке источника? – rnevius

+0

он выводит слизню. My Second Post Jimmyn

+0

Это может быть случай шаблона, который неожиданно переопределяет другой шаблон. Я всегда стараюсь упорядочить мои шаблоны из * most *, специфичных для * наименее * конкретных (от самого длинного до кратчайшего). – Brandon

ответ

3

При определении URLs с этим:

url(r'^', views.BlogIndex.as_view(), name="blog"), 
url(r'^entry/(?P<slug>\S+)$', views.BlogDetail.as_view(), name="entry_detail"), 

Второй элемент соответствует /entry, который не то, что вы ожидаете. Я думаю, что в вашем случае, вы должны определить это так:

url(r'^$', views.BlogIndex.as_view(), name="blog"), 
url(r'^entry/(?P<slug>\S+)$', views.BlogDetail.as_view(), name="entry_detail"), 

^$ будет соответствовать /, но не /entry/...

+0

Хорошо, я понимаю, что вы имеете в виду. Отрезав URL-адрес в/вы не позволяете ему соответствовать /entry/..ect, поэтому он не имеет конфликта и приводит к первому URL-адресу в списке URL-адресов. – Jimmyn

+0

Но вы разрешаете ему соответствовать '/entry' ... Если он не соответствует'/', он переходит к'/entry' ...Если я чего-то не хватает, это правильный ответ. – rnevius

+0

@rnevius извините, должно быть, сказано немного плохо. Да, я согласен с тобой. – Jimmyn

0

Проблема решена благодаря Brandon. Перестроил мои шаблоны url от наиболее специфических до наименее специфических (от длинного до кратчайшего). И перезапустил сервер.

urlpatterns = patterns(
    '', 
    url(r'^entry/(?P<slug>\S+)$', views.BlogDetail.as_view(), name="entry_detail"), 
    url(r'^feed/$', feed.LatestPosts(), name="feed"), 
    url(r'^', views.BlogIndex.as_view(), name="blog"),  
) 
Смежные вопросы