Regex Django与URL不匹配

Regex Django与URL不匹配,regex,django,django-urls,Regex,Django,Django Urls,我一直在开发一个django web应用程序(使用django 1.3),这是一个产品的web目录,在我被要求添加一个自定义管理站点之前,它一直运行良好。我完全了解Django管理站点,但是客户端非常老式,而且对技术一无所知,所以我必须创建一个“傻瓜版”管理站点。根urlconf: from django.conf.urls.defaults import * from django.views.generic import TemplateView from store.models imp

我一直在开发一个django web应用程序(使用django 1.3),这是一个产品的web目录,在我被要求添加一个自定义管理站点之前,它一直运行良好。我完全了解Django管理站点,但是客户端非常老式,而且对技术一无所知,所以我必须创建一个“傻瓜版”管理站点。根urlconf:

from django.conf.urls.defaults import *
from django.views.generic import TemplateView

from store.models import Category

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^^$', TemplateView.as_view(
            template_name='homepage.html',
            get_context_data=lambda: {
                'crumb': 'home',
                'category_list':Category.objects.all()
                }
            ), 
        name='home'),
    url(r'^favicon\.ico$', 'django.views.generic.simple.redirect_to', {'url': '/static/img/favicon.ico'}),
    url(r'^store/', include('store.urls', app_name='store', namespace='store')),
)
以及商店应用程序的urlconf:

from django.conf import settings
from django.conf.urls.defaults import *


from store import views


urlpatterns = patterns ('',
    url(r'^category/$', views.get_brands, name='get_brands'),
    url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
    url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),
)
以及原意:

from django.http import Http404
from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView
from store.models import Category, Brand, Product

def get_brands(request):
    q = request.GET.get('q')
    if q is not None:
        category = get_object_or_404(Category, slug__iexact=q)
        try:
            brands = category.brands.all()
        except:
            brands = []

        template = 'infobox.html'
        data = {
            'category': category,
            'brands': brands,
        }
        return render( request, template, data )



class GalleryView(ListView):
    context_object_name = 'product_list'
    template_name = 'store/gallery.html'

    def get_queryset(self):
        self.category = get_object_or_404(Category, slug__iexact=self.args[0])
        try:
            brand = Brand.objects.get(slug__iexact = self.args[1])
            self.brand_name = brand.name
        except:
            #no brand is specified, show products with no brand
            if self.category.category_products.filter(brand__isnull=True):
                #if there are products with no brand, return those
                return self.category.category_products.filter(brand__isnull=True)
            else:
                #if all products have a brand, return the products of the first brand
                all = self.category.brands.all()
                if all:
                    brand = all[0]
                    self.brand_name = brand.name
                    return brand.brand_products.all()
                else:
                    raise Http404
        else:
            #brand is specified, show its products
            return Product.objects.filter(category=self.category, brand=brand)

    def get_context_data(self, **kwargs):
        context = super(GalleryView, self).get_context_data(**kwargs)
        category = self.category
        category_brands = self.category.brands.all()
        context['category_list'] = Category.objects.all()
        context['category'] = category
        context['crumb'] = category.name
        context['category_brands'] = category_brands
        try:
            context['brand'] = self.brand_name
        except:
            context['brand'] = None

        return context
现在,我的自定义管理应用程序在本地开发环境中运行良好,但当我向prod添加新的URL和视图时,Django似乎与任何新的URL都不匹配。原来的视图和URL仍然有效,但是没有一个新的URL得到匹配,我只是不断得到一个404NotFound错误

更新的urlconf:

from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
from django.contrib.auth.decorators import login_required


from store import views


admin_urls = patterns ('',
    url(r'^$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
    url(r'^add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
)


urlpatterns = patterns ('',
    url(r'^category/$', views.get_brands, name='get_brands'),
    url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
    url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),
    url(r'^login/$', views.admin_login, name='login'),
    url(r'^logout/$', views.admin_logout, name='logout'),
    url(r'^logout/success/$', views.admin_logout_success, name='logout_success'),
    url(r'^test/', views.test, name='test'),
    url(r'^admin/', include(admin_urls, namespace='admin')),
    url(r'^ajax/$', views.ajax_request, name='ajax_request'),
)
from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
from django.contrib.auth.decorators import login_required


from store import views


admin_urls = patterns ('',
)


urlpatterns = patterns ('',
    url(r'^category/$', views.get_brands, name='get_brands'),
    url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
    url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),

    url(r'^login/$', views.admin_login, name='login'),
    url(r'^logout/$', views.admin_logout, name='logout'),
    url(r'^logout/success/$', views.admin_logout_success, name='logout_success'),

    url(r'^ajax/$', views.ajax_request, name='ajax_request'),
    url(r'^administration/$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
    url(r'^administration/add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
)

请注意,即使是简单的“/store/test/”url也不会匹配。我不太清楚Django为什么不匹配我的url,非常感谢您的帮助。

我不太清楚发生了什么,因为我的所有模板都使用{%url%}标记链接到其他页面,但我认为我的url变得混乱的原因是因为我使用了r'^(\w+/$)正则表达式,所以它匹配任何单词。我只是简单地将带有(\w+)规则的URLConf移到了urls.py的底部,并对它们进行了重构,使其更加具体,它们再次成为黄金

更新的urlconf:

from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
from django.contrib.auth.decorators import login_required


from store import views


admin_urls = patterns ('',
    url(r'^$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
    url(r'^add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
)


urlpatterns = patterns ('',
    url(r'^category/$', views.get_brands, name='get_brands'),
    url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
    url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),
    url(r'^login/$', views.admin_login, name='login'),
    url(r'^logout/$', views.admin_logout, name='logout'),
    url(r'^logout/success/$', views.admin_logout_success, name='logout_success'),
    url(r'^test/', views.test, name='test'),
    url(r'^admin/', include(admin_urls, namespace='admin')),
    url(r'^ajax/$', views.ajax_request, name='ajax_request'),
)
from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
from django.contrib.auth.decorators import login_required


from store import views


admin_urls = patterns ('',
)


urlpatterns = patterns ('',
    url(r'^category/$', views.get_brands, name='get_brands'),
    url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
    url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),

    url(r'^login/$', views.admin_login, name='login'),
    url(r'^logout/$', views.admin_logout, name='logout'),
    url(r'^logout/success/$', views.admin_logout_success, name='logout_success'),

    url(r'^ajax/$', views.ajax_request, name='ajax_request'),
    url(r'^administration/$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
    url(r'^administration/add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
)

正如您在评论中提到的,删除所需的登录名可以修复问题。以下是django文档对decorator的看法:

login_required()执行以下操作:

  • 如果用户未登录,请重定向到settings.LOGIN\u URL,在查询字符串中传递当前绝对路径。例子: /accounts/login/?next=/polls/3/
  • 如果用户已登录,则正常执行视图
  • […]注意,如果不指定login_url参数,则 需要将适当的Django视图映射到settings.LOGIN\u URL

    换句话说,它会转到一个默认url,您可以在settings.LOGIN\u url中覆盖该url

    下面是我认为发生的事情-我认为您在这里定义了自己的登录:

    url(r'^login/$', views.admin_login, name='login'),
    
    由于新url中需要的登录名指向默认url,而默认url不存在,因此返回404。但是,当您在其他URL之后配置登录所需的视图时:

    url(r'^login/$', views.admin_login, name='login'),
    ...
    url(r'^administration/$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
    url(r'^administration/add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
    
    成功了。为什么呢?您没有在此处覆盖登录URL,对吗?但您确实这样做了,因为此时,您重新定义了名称空间“login”以指向您自己的视图。现在,文档中没有提到这一点,但它是有意义的,查看默认的管理模板,您可以看到这是正在使用的名称空间


    这对您有意义吗?

    难道您忘了重新加载prod服务器吗?不,我没有。如果解决方案真的那么简单的话:我一次只评论一行,然后重新加载。你可能会发现正则表达式中遗漏了一些愚蠢的东西。另外,我注意到您将admin更改为手动包含,请尝试回滚该部分(或者一起注释admin)。我尝试了您的建议,似乎管理索引的urlconf是罪魁祸首。尽管正则表达式本身没有问题(r'^$),但当我删除了登录所需的装饰器时,它又开始工作了。HmmDoesn管理员不需要在没有decorator的情况下登录吗?您的视图是否在未手动添加的情况下未被标记?是否需要解释此处发生的情况的答案?当然,这将帮助我避免在开发过程中出现任何进一步的问题:我认为我理解这一点,但不再那么确定。你能帮我测试一下吗?像以前一样重做urlconf并将这一行添加到settings.py:
    LOGIN\u URL='/store/LOGIN/'
    实际上,我的settings.py中已经有了这一行。对不起,我在问题中不清楚。你看到我的答案了吗?