Django - 没有反向匹配/

时间:2014-04-21 10:02:38

标签: python django

我试图获取模型中特定项目的绝对网址。

models.py

class BannerAds(models.Model):
    name = models.CharField(max_length=256)
    phone = models.CharField(max_length=20)

    def __unicode__(self):
        return self.name

    @permalink
    def get_absolute_url(self):
        from django.core.urlresolvers import reverse
        return reverse('index', args=[str(self.name)])

views.py

def banners(request):
    context = RequestContext(request)
    all_banners = BannerAds.objects.all()
    content_dict = {'banners': all_banners,}
    return render_to_response('templates/banner.html', content_dict, context)


def index(request):
    context = RequestContext(request)
    banner_list = BannerAds.objects.all()
    city_list = Cities.objects.order_by('name')
    offer_list = NewOffers.objects.order_by('offer_add_date')[:5]
    context_dic = {'banner_list': banner_list,
                   'cities': city_list,
                   'offers': offer_list,
                   }
    return render_to_response('templates/index.html', context_dic, context)

urls.py

urlpatterns = patterns('',


    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', views.index, name='index'),
    url(r'^advertise/', views.advertise, name='advertise'),
    url(r'^about/', views.about, name='about'),
    url(r'^listing/', views.listing, name='listing'),
    url(r'^search/', views.search, name='search'),
    url(r'^add/', views.add_listing, name='add'),
    url(r'^offers/', views.offers, name='offer'),
    url(r'^add_listing/$', views.add_listing, name='add_listing'),
    url(r'^listing/(?P<listing_url>\w+)/$', views.listing, name='category'),
    url(r'^testimonial/', views.testimonials, name='testimonial'),
    url(r'^add_testimonial', views.add_testimonial, name='add_testimonial'),
    url(r'^banner', views.banners, name='banners'),
)

我输入的测试数据为name = test,phone = testing。

当我尝试打开该页面时,它会给我一个No Reverse Match at /错误以及一个 Reverse for '' with arguments '('Testing',)' and keyword arguments '{}' not found. 0 pattern(s) tried: []

知道我错过了什么吗?我是Django开发的新手,所以带代码示例的解决方案对我有很大的帮助。

3 个答案:

答案 0 :(得分:0)

将视图banners更改为传递args。

def banners(request, name):
    context = RequestContext(request)
    all_banners = BannerAds.objects.all()
    content_dict = {'banners': all_banners,}
    return render_to_response('templates/banner.html', content_dict, context)

另外,请确保您已使用name="banners"

在urls.py中输入了一个条目

答案 1 :(得分:0)

不要同时使用@permalinkreverse()。他们做同样的事情。删除装饰器,或者只返回(view_name,args)的元组。

事实上,文档说永久链接已被弃用,所以最好的办法就是删除它。

答案 2 :(得分:0)

网址url(r'^$', views.index, name='index')不接受任何参数,那么为什么要在这里传递参数reverse('index', args=[str(self.name)])

如果您想要详情视图,并希望name成为index的可选参数,那么您可以这样做:

url(r'^(?:(?P<name>.+?)/)?$', views.index, name='index')

同时将index视图更改为:

def index(request, name=None):
    context = RequestContext(request)
    banner_list = BannerAds.objects.all()

    # now if name parameter is not None you may want to just pick single object
    banner_obj = None
    if name:
        banner_obj = BannerAds.objects.get(name__exact=name)

    city_list = Cities.objects.order_by('name')
    offer_list = NewOffers.objects.order_by('offer_add_date')[:5]
    context_dic = {'banner_list': banner_list,
                   'cities': city_list,
                   'offers': offer_list,
                   'banner_obj': banner_obj,
                   }
    return render_to_response('templates/index.html', context_dic, context)

或者有一个单独的视图,用于BannerAds的详细信息。