2013-04-11 94 views
0

我真的很困惑,为什么我收到Http404错误。为了更清楚我的继承人代码:Django http404错误urlconf混淆

我的应用程序名为books

views.py

from django.shortcuts import render_to_response 
from django.http import Http404 
from django.template import RequestContext 
from books.models import * 


def index(request): 
    title = 'Book Gallery' 
    books = Book.objects.all().order_by('-id') 
    lang_list = Lang.objects.all().order_by('-lang') 
    template = 'books/index.djhtml' 
    context = {'books': books, 'title': title, 'lang_list': lang_list} 
    return render_to_response(template, context, context_instance=RequestContext(request)) 

def by_book_slug(request, bookslug): 
    slug = bookslug 
    try: 
     book = Book.objects.get(slug=slug) 
    except: 
     raise Http404 

    title = book.name 
    template = 'books/singlebook.djhtml' 
    context = {'book': book, 'title': title} 
    return render_to_response(template, context, context_instance=RequestContext(request)) 

def by_lang_slug(request, langslug): 
    filter = langslug 
    try: 
     language = Lang.objects.get(slug=filter) 
    except: 
     raise Http404 
    lang_list = Lang.objects.all().order_by('-lang') 
    books = Book.objects.filter(lang=language).order_by('-id') 
    title = language 
    template = 'books/by_language.djhtml' 
    context = {'books': books, 'title': title, 'filter': filter, 'lang_list': lang_list} 
    return render_to_response(template, context, context_instance=RequestContext(request)) 




urls.py inside my book app folder 

from django.conf.urls import patterns, include, url 
from books import views 

urlpatterns = patterns('', 
    url(r'(?P<langslug>.*)/$', views.by_lang_slug, name='by_lang'), 
    url(r'(?P<bookslug>.*)/$', views.by_book_slug, name='by_book'), 
    url(r'^$', views.index, name='book_gallery'), 
) 

环节,涉及到langslug网址的conf作品,但这些链接的URL bookslug CONF不起作用。当我尝试切换它们时,其中一个工作,另一个不工作。

我真的不知道这里发生了什么。任何帮助将是一个很大的帮助。谢谢。

我的书应用程序的索引模板

{% extends 'base.djhtml' %} 

{% block title %} | Gallery{% endblock %} 
{% block stylesheets %} 
    <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/style.css" /> 
{% endblock %} 
{% block content_header %} 
{% endblock %} 
{% block content_body %} 
    <div class="row"> 
     <div class="span3"> 
      <strong>filtered by > 
       {% if filter %} 
        {{ filter }} 
       {% else %} 
        All 
       {% endif %} 
      </strong> 
      <ul class="nav nav-list"> 
       <li class="nav-header">Filter</li> 
       <li class="nav-header 
        {% if not filter %} 
         active 
        {% endif %} 
       "><a href="/books/">All</a></li> 
       {% for list in lang_list %} 
       <li class="nav-header 
        {% if filter == list.slug %} 
         active 
        {% endif %} 
       "> 
        <a href="{% url by_lang langslug=list.slug %}">{{ list.lang }}</a> 
       </li> 
       {% endfor %} 
      </ul> 
     </div> 
     <div class="span9"> 
      {% for book in books %} 
       <div class="span3"> 
        <a href="{{ book.book_cover.url }}"> 
         <img alt="{{book.name}}" src="{{ book.thumbnail.url }}" /> 
        </a> 
        <h4>{{book.name}}</h4> 
        <p>{{book.desc|truncatewords:15}}</p> 
        <a href="{% url by_book bookslug=book.slug %}" class="btn btn-mini">View more...</a> 
       </div> 
      {% endfor %} 
     </div> 
    </div> 
{% endblock %} 

{% extends 'base.djhtml' %} 

{% block title %} | Gallery{% endblock %} 
{% block stylesheets %} 
    <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/style.css" /> 
{% endblock %} 
{% block content_header %} 
{% endblock %} 
{% block content_body %} 
    <div class="row"> 
     <div class="span3"> 
      <strong>filtered by > 
       {% if filter %} 
        {{ filter }} 
       {% else %} 
        All 
       {% endif %} 
      </strong> 
      <ul class="nav nav-list"> 
       <li class="nav-header">Filter</li> 
       <li class="nav-header 
        {% if not filter %} 
         active 
        {% endif %} 
       "><a href="/books">All</a></li> 
       {% for list in lang_list %} 
       <li class="nav-header 
        {% if filter == list.slug %} 
         active 
        {% endif %} 
       "> 
        <a href="{% url by_lang langslug=list.slug %}">{{ list.lang }}</a> 
       </li> 
       {% endfor %} 
      </ul> 
     </div> 
     <div class="span9"> 
      {% for book in books %} 
       <div class="span3"> 
        <a href="{{ book.book_cover.url }}"> 
         <img alt="{{book.name}}" src="{{ book.thumbnail.url }}" /> 
        </a> 
        <h4>{{book.name}}</h4> 
        <p>{{book.desc|truncatewords:15}}</p> 
        <a href="{% url by_book bookslug=book.slug %}" class="btn btn-mini">View more...</a> 
       </div> 
      {% endfor %} 
     </div> 
    </div> 
{% endblock %} 

时指定塞不匹配的任何查询我已经包括加薪Http404方法为我的书应用程序的by_language模板数据库。我感到困惑的是,当我尝试切换langslug和bookslug urlconf时,与这些url之一关联的链接不起作用。

+0

在你的Django外壳,尝试'Book.objects.get(塞=蛞蝓)'这里蛞蝓是您正在使用测试值,看看有什么发生。 – karthikr 2013-04-11 03:00:20

+0

在附注中,'get_object_or_404(Book,slug = slug)'与'try..except'做同样的事情 – karthikr 2013-04-11 03:00:58

+0

谢谢你纠正我karthikr – 2013-04-11 03:14:32

回答

0

根据您的网址,如果我把值就可以了,即使他们有不同的看法,其结果必然是:

urlpatterns = patterns('', 

    # http://localhost:8000/English/ 
    url(r'(?P<langslug>.*)/$', views.by_lang_slug, name='by_lang'), 

    # http://localhost:8000/YourBook/ 
    url(r'(?P<bookslug>.*)/$', views.by_book_slug, name='by_book'), 

    # http://localhost:8000/ 
    url(r'^$', views.index, name='book_gallery'), 
) 

你有没有注意到它,它们有相同的模式,使第一视图执行是by_lang_slug。所以,如果您更改订单,另一个将首先执行。要做的最好的事情是有a unique url name

urlpatterns = patterns('', 

    # http://localhost:8000/lang/English/ 
    url(r'lang/(?P<langslug>.*)/$', views.by_lang_slug, name='by_lang'), 

    # http://localhost:8000/book/YourBook/ 
    url(r'book/(?P<bookslug>.*)/$', views.by_book_slug, name='by_book'), 

    # http://localhost:8000/ 
    url(r'^$', views.index, name='book_gallery'), 
) 

现在,他们是不同的....

+0

我很高兴Cath,您救了我。非常感谢你,我一整晚都在想这件事。非常感谢你,上帝保佑 – 2013-04-11 03:46:31

+0

欢迎........ – catherine 2013-04-11 11:53:53

+0

@DjangoBot如果你觉得答案是有帮助的,一定要接受它!点击答案旁边的复选标记。 – 2013-04-15 06:21:19