【问题标题】:View function is not called from urls.patterns不从 urls.patterns 调用视图函数
【发布时间】:2015-04-01 19:13:43
【问题描述】:

urls.py 模式不调用我的视图函数。我只能明确地调用它们。

基本布局是

--project
----persons
----project

project/urls.py 是:

from django.conf.urls import url, include, patterns
from .views import page   #irrelevant
# from persons import views as person_views

urlpatterns = patterns('',
    url(r'^(?P<slug>[\w./-]+)/$', page, name='page'), #irrelevant
    url(r'^$', page, name='homepage'),                #irrelevant
    url(r'^persons/', include('persons.urls', namespace='persons')),  # WORKS
#   url(r'^persons/$', person_views.persons, name='persons'),   #wont work
#   url(r'^persons/add/$', person_views.add_person, name='add_person'),  #wont work
)

到目前为止一切都很好,因为persons.urls被成功包含了......但是在里面:

persons/urls.py:

from django.conf.urls import patterns, url
#from persons.views import index_persons, add_person
from persons import views

#views.index_persons('GET / HTTP/1.0')  # >>> WORKS - function called <<< !!!

urlpatterns = patterns('',
    url(r'.', views.index_persons, name='index_persons'), # DOES NOT WORK
    url(r'^add/', views.add_person, name='add_person'),   # DOES NOT WORK
)

我也尝试过其他正则表达式,例如:

    url(r'*', views.index_persons, name='index_persons'), # DOES NOT WORK
    url(r'^$', views.index_persons, name='index_persons'), # DOES NOT WORK

运气不好……

我的persons/views.py 文件包含:

def index_persons(request):
    print 'WHY???'

def add_person(request):
    print 'WHY???'

'为什么???'通常在控制台中打印(标准输出 - 因为我从 manage.py runserver 执行),当 index_persons 函数被从 person/urls.py 显式调用

有什么想法吗?

【问题讨论】:

    标签: django django-views django-urls


    【解决方案1】:

    project/urls.py 中,将page 网址格式移到其他网址格式下方。否则,对/persons/ 的请求将首先与page url 模式匹配。

    url(r'^$', page, name='homepage'),
    url(r'^persons/', include('persons.urls', namespace='persons')),
    url(r'^(?P<slug>[\w./-]+)/$', page, name='page'),
    

    persons/urls.py 中,你应该有:

    urlpatterns = patterns('',
        url(r'^$', views.index_persons, name='index_persons'),
        url(r'^add/$', views.add_person, name='add_person'),
    )
    

    【讨论】:

    • 非常感谢阿拉斯代尔。准确地说,我必须将r'^persons/ 规则放在其他两个语句的下方。
    • 很高兴你能成功。我之前复制粘贴的时候顺序错了,我现在修好了。
    【解决方案2】:

    你的 url 规则应该是

    url(r'^/?$, views.index_persons, name='index_persons'), 
    

    注意 1:不要忘记重新启动服务器。

    注意2namespace='persons'等于未设置namespace,因为你的urlpersons/是一样的。

    【讨论】:

    • 第二个注释不是真的,Django 没有从 url 模式中获取命名空间。如果不设置,则 url 没有命名空间。
    • @knbk 我的意思是,是相同的,因为您的 url 模式和命名空间将是相同的。
    • 好吧,也许我理解错了。如果您的意思是无论命名空间如何,匹配路径都是相同的,那么您是对的。但是,不(明确)设置命名空间或将其设置为 'persons' 在反转 url 时会有很大的不同。
    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多