0

我认为我做的一切都是正确的,但我不知道为什么它不起作用。当我尝试访问某个页面时,我收到错误“找不到页面 (404)”。

所以,这个所有产品页面工作 127.0.0.1:8000/products/ 但是当我尝试访问单个产品页面 127.0.0.1:8000/products/audi 时,我收到错误,它没有找到......

所以,也许你这里有什么问题?谢谢你。

Page not found (404)
Request Method: GET
Request URL:    http://link/products/audi
Using the URLconf defined in ecommerce.urls, Django tried these URL patterns, in this order:
^static/(?P<path>.*)$
^media/(?P<path>.*)$
^admin/doc/
^admin/
^products/ ^$ [name='products']
^products/ ^$(?P<slug>.*)/$
^contact/ [name='contact_us']
The current URL, products/audi, didn't match any of these.

主项目urls.py:

from django.conf import settings
from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    (r'^static/(?P<path>.*)$', 'django.views.static.serve', {
        'document_root': settings.STATIC_ROOT
        }),
    (r'^media/(?P<path>.*)$', 'django.views.static.serve', {
    'document_root': settings.MEDIA_ROOT
        }),
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^products/', include('products.urls')),
    url(r'^contact/', 'contact.views.contact_us', name='contact_us'),
)

产品应用程序 urls.py:

from django.conf import settings
from django.conf.urls import patterns, include, url


urlpatterns = patterns('products.views',
    url(r'^$', 'all_products', name='products'),
    url(r'^$(?P<slug>.*)/$', 'single_product'),
)

视图.py

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response, RequestContext, get_object_or_404

from .models import Product

def all_products(request):
    products = Product.objects.filter(active=True)
    return render_to_response('products/all.html', locals(), context_instance=RequestContext(request))


def single_product(request, slug):
    product = get_object_or_404(Product, slug=slug)
    return render_to_response('products/single.html', locals(), context_instance=RequestContext(request))

模型.py

from django.db import models

# Create your models here.
class Product(models.Model):
    title = models.CharField(max_length=220)
    description = models.CharField(max_length=3000, null=True, blank=True)
    price = models.DecimalField(max_digits=1000, decimal_places=2, null=True, blank=True)
    slug = models.SlugField()
    active = models.BooleanField(default=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)

    def __unicode__(self):
        return self.title
    class Meta:
        ordering = ['title',]


class ProductImage(models.Model):
    product = models.ForeignKey(Product)
    description = models.CharField(max_length=3000, null=True, blank=True)
    image = models.ImageField(upload_to='product/images/')
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)

    def __unicode__(self):
        return self.image
4

2 回答 2

3

你的 URL 模式在开头有一个额外$的,所以它永远不会匹配任何东西:

url(r'^$(?P<slug>.*)/$', 'single_product')

这应该是:

url(r'^(?P<slug>.*)/$', 'single_product')

这仍然需要一个尾部斜杠,这是正常模式。更正后,您的 URL 应该是/products/audi/. 您没有显示创建该 URL 的上下文,但这是一个示例,说明为什么尽可能使用 Django 的url 反转来构建 URL 是一个好主意。这看起来像这样,在 Python 代码中(例如,可能在get_absolute_url模型上的方法中:

reverse('single_product', kwargs={'slug': someproduct.slug})

或者像这样,在模板中:

Django 1.5:

{% url 'single_product' someproduct.slug %}

Django 1.4 及更早版本:

{% url single_product someproduct.slug %}
于 2013-11-05T23:41:27.723 回答
2

你有一个错字:

url(r'^$(?P<slug>.*)/$', 'single_product'),

请注意这一点$^在正则表达式中,它表示字符串结束。用。。。来代替

url(r'^(?P<slug>.*)/$', 'single_product'),
于 2013-11-05T23:49:46.117 回答