当前位置: 动力学知识库 > 问答 > 编程问答 >

python - Issue with URL pattern in Django with webmonkey tutorial

问题描述:

I have been working my way through the Django webmonkey tutorial and am currently stuck in lesson 4 available here http://www.webmonkey.com/2010/02/Use_Templates_in_Django/.

My problem is with the blog detail template, whenever I click the link on my blog/list.html page to view the detail of the entry I get a Page not found (404).

This is exactly the error I see:

Page not found (404)

Request Method: GET

Request URL:http://127.0.0.1:8000/2010/dec/17/welcome-my-blog/

Using the URLconf defined in djangoblog.urls, Django tried these URL patterns, in this order:

^admin/(.*)

^blog/

^tags/(?P<slug>[a-zA-Z0-9_.-]+)/$

The current URL, 2010/dec/17/welcome-my-blog/, didn't match any of these.

These are my url.py files as well as my models.py, I didn't post my admin, tag views or settings but I can if it would help.

djangoblog\urls.py

# This also imports the include function

from django.conf.urls.defaults import *

from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',

(r'^admin/(.*)', admin.site.root),

(r'^blog/', include('djangoblog.blog.urls')),

(r'^tags/(?P<slug>[a-zA-Z0-9_.-]+)/$', 'djangoblog.tag_views.tag_detail'),

)

djangoblog\blog\urls.py

from django.conf.urls.defaults import *

from djangoblog.blog.models import Entry

from tagging.views import tagged_object_list

info_dict = {

'queryset': Entry.objects.filter(status=1),

'date_field': 'pub_date',

}

urlpatterns = patterns('django.views.generic.date_based',

(r'(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>w{1,2})/(?P<slug>[-w]+)/$',

'object_detail', dict(info_dict, slug_field='slug',template_name='blog/detail.html')),

(r'^(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>w{1,2})/(?P<slug>[-w]+)/$',

'object_detail', dict(info_dict, template_name='blog/list.html')),

(r'^(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>w{1,2})/$',

'archive_day',dict(info_dict,template_name='blog/list.html')),

(r'^(?P<year>d{4})/(?P<month>[a-z]{3})/$','archive_month', dict(info_dict, template_name='blog/list.html')),

(r'^(?P<year>d{4})/$','archive_year', dict(info_dict, template_name='blog/list.html')),

(r'^$','archive_index', dict(info_dict, template_name='blog/list.html')),

)

djangoblog\blog\models.py.

from django.db import models

from django.contrib.syndication.feeds import Feed

from django.contrib.sitemaps import Sitemap

import markdown

from tagging.fields import TagField

from tagging.models import Tag

class Entry(models.Model):

title = models.CharField(max_length=200)

slug = models.SlugField(

unique_for_date='pub_date',

help_text='Automatically built from the title.'

)

body_html = models.TextField(blank=True)

body_markdown = models.TextField()

pub_date = models.DateTimeField('Date published')

tags = TagField()

enable_comments = models.BooleanField(default=True)

PUB_STATUS = (

(0, 'Draft'),

(1, 'Published'),

)

status = models.IntegerField(choices=PUB_STATUS, default=0)

class Meta:

ordering = ('-pub_date',)

get_latest_by = 'pub_date'

verbose_name_plural = 'entries'

def __unicode__(self):

return u'%s' %(self.title)

def get_absolute_url(self):

return "/%s/%s/" %(self.pub_date.strftime("%Y/%b/%d").lower(), self.slug)

def save(self):

self.body_html = markdown.markdown(self.body_markdown, safe_mode = False)

super(Entry, self).save()

def get_previous_published(self):

return self.get_previous_by_pub_date(status__exact=1)

def get_next_published(self):

return self.get_next_by_pub_date(status__exact=1)

def get_tags(self):

return Tag.objects.get_for_object(self)

If there are any other files that would help I can provide them. My file structure is laid out below:

File Structure

C:\Workspaces\python\djangoblog

urls.py

tag_views.py

settings.py

manage.py

djangoblog.db

admin.py

__init__.py

templates

blog

detail.html

list.html

tags

detail.html (empty)

list.html (empty)

base.html

tagging

markdown

blog

__init__.py

admin.py

models.py

tests.py

urls.py

views.py

Edit: (from comment on Josh's answer)

404 at: blog/dec/17/welcome-my-blog/:

^admin/(.*)

^blog/ (?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>w{1,2})/(? P<slug>[-w]+)/$

^blog/ ^(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>w{1,2})/(? P<slug>[-w]+)/$

^blog/ ^(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>w{1,2})/$

^blog/ ^(?P<year>d{4})/(?P<month>[a-z]{3})/$

^blog/ ^(?P<year>d{4})/$

^blog/

^$ ^tags/(?P<slug>[a-zA-Z0-9_.-]+)/$

The current URL, blog/2010/dec/17/welcome-my-blog/, didn't match any of these.

网友答案:

The problem is that none of your URL patterns match the URL in the browser.

http://127.0.0.1:8000/2010/dec/17/welcome-my-blog/

Is the URL that you're trying to reach. I assume that is meant to be a blog entry, reachable at the URL blog/.

Your root URL patterns are the following:

urlpatterns = patterns('',
    (r'^admin/(.*)', admin.site.root),    
    (r'^blog/', include('djangoblog.blog.urls')),
    (r'^tags/(?P[a-zA-Z0-9_.-]+)/$', 'djangoblog.tag_views.tag_detail'),
)

Which means that none of them match your URL in the browser, since it does not start with either admin or blog or tags.

The following URL may fix your problem:

http://127.0.0.1:8000/blog/2010/dec/17/welcome-my-blog/

Notice the /blog/ after the IP:Port. This will match the blog/ entry in your root URL conf. Then it is up to your djangoblog.blog.urls file to handle the rest of the pattern, which it looks like it does.

(r'(?Pd{4})/(?P[a-z]{3})/(?Pw{1,2})/(?P[-w]+)/$', 'object_detail', dict(info_dict, slug_field='slug',template_name='blog/detail.html'))

The above pattern looks for:
- 4 numbers (2010)
- then a /
- then 3 letters (dec)
- then a /
- then a word with 1 or 2 characters (17)
- then a /
- then a word (welcome-my-blog)

You should be fine by adding the /blog/ after the IP:port.

Your Update:

^blog/ (?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>w{1,2})/(? P<slug>[-w]+)/$ 

The above URL is incorrect. You need to prepend it with a ^ as the other URLS.

网友答案:

For those that miss it as I did the major change is to change this - P<year>d{4} to this P<year>\d{4}. That is add the backslash. You may also wish to take a look at the /$ at the end of the lines. These will force your urls to end in a "/".

网友答案:

Figured it out, Josh was right about the URL pattern missing the /blog. I updated my list template like so:

<p><a href="/blog{{object.get_absolute_url}}">read more</a></p>

That resolved the /blog error, after that I needed to modify my djangoblog\blog\urls.py like so:

djangoblog\blog\urls.py

urlpatterns = patterns('django.views.generic.date_based',

(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\d{1,2})/(?P<slug>[-\d\w]+)/$', 'object_detail', dict(info_dict, slug_field='slug',template_name='blog/detail.html')),

(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\d{1,2})/(?P<slug>[-\d\w]+)/$', 'object_detail', dict(info_dict, template_name='blog/list.html')),

(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\d{1,2})/$','archive_day',dict(info_dict,template_name='blog/list.html')),

(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$','archive_month', dict(info_dict, template_name='blog/list.html')),

(r'^(?P<year>\d{4})/$','archive_year', dict(info_dict, template_name='blog/list.html')),

(r'^$','archive_index', dict(info_dict, template_name='blog/list.html')),

)

Once I made those two changes all of my URL's were fixed, I can't take credit for the urls.py fix as I found it on this site:

http://ubuntuforums.org/showthread.php?p=9650959

Hope this helps others in the future with this tutorial.

分享给朋友:
您可能感兴趣的文章:
随机阅读: