【问题标题】:Beginner Django: trouble defining URL paths初学者 Django:定义 URL 路径的麻烦
【发布时间】:2014-04-03 14:56:31
【问题描述】:

我对 Python 有一些经验,但我对 Django 和一般的 Web 开发还是很陌生。

我有一个问题,我设置了两个 URL,但只会呈现其中一个:即 URL 模式列表中的第一个。 我才刚刚开始,所以基本上,我现在只有一个显示用户注册表单的页面和一个基本的“Hello, World”页面。

给定当前配置,并运行开发服务器,无论我转到 URL localhost:8000/mysite 还是 localhost:8000/registration,我都会被带到注册表单页面。如果我在 mysite/myapp/urls.py 的 urlpatterns 列表中颠倒两者的顺序,两个 URL 都会将我带到“Hello, World”页面。

我知道我一定做错了什么,但我似乎无法弄清楚。谢谢!

mysite/myapp/urls.py 看起来像这样:

from django.conf.urls import patterns, url
from myapp import views

urlpatterns = patterns('',
    url(r'^$', views.registration, name='registration'),
    url(r'^$', views.index, name='index'),
)

我的文件 mysite/urls.py 如下所示:

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

from django.contrib import admin  
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^mysite/', include('myapp.urls')),
    url(r'^registration/', include('myapp.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

myapp/views.py 看起来像这样:

from django.shortcuts import render
from django.http import HttpResponseRedirect, HttpResponse
from myapp.forms import UserRegistrationForm

def index(request):
    return HttpResponse("Hello, world. You're at the main page for MySite!")

def registration(request):
    if request.method == 'POST':
        form = UserRegistrationForm(request.POST)

        if form.is_valid():
            # stuff gets done with form            
            return HttpResponseRedirect('/registration/')
    else:
        form = UserRegistrationForm()

    return render(request, 'myapp/registration_form.html', {
        'form': form,
    })

【问题讨论】:

    标签: django url


    【解决方案1】:

    将具有不同前缀的模式放入同一个包含的 urlconf 是没有意义的。这意味着没有办法区分它们。请记住,所发生的只是您的浏览器告诉 Django“在此 URL 上为我提供内容”,因此 Django 需要为您要提供的每个不同视图提供一个不同的 URL。

    如果您想在不带前缀的情况下同时提供两个 URL,则可以包含不带前缀的整个 urlconf:

    mysite/urls.py:

    url(r'', include('myapp.urls'),
    

    myapp.urls.py:

    url(r'^registration/$', views.registration, name='registration'),
    url('r^index/$', views.index, name='index'),
    

    或者,甚至更简单,根本不需要包含特定于应用程序的 urlconf,直接在 mysite/urls.py 中使用这两个 url 模式。

    【讨论】:

      【解决方案2】:

      问题是您尝试使用与索引页面相同的 url 模式 (r'^$') 访问注册页面。所以你应该访问与 smt 不同的注册页面。例如

      urlpatterns = patterns('registration',
          url(r'^registeration/$', views.registration),
          url(r'^$', views.index, name='index'),
      )
      

      【讨论】:

      • 这与下面的答案相同,但不起作用。使用此解决方案,不是两个 URL 都调用 registration() 函数,而是调用 index() 函数。
      • 您确定您确实按照建议编辑了mysite/urls.py 上的网址吗?
      • 我不确定我是否跟随。我想使用 localhost:8000/registration 访问注册页面(视图中的registration() 方法),并使用localhost:8000/mysite 访问“Hello, World”页面(视图中的index() 方法)。到目前为止,没有一个答案提供了该解决方案。
      【解决方案3】:

      您用于两者的正则表达式是相同的r'^$',您必须将网址更改为更通用的内容。发生这种情况是因为 url 路由获取 url 标识匹配正则表达式的文本并重定向到它在元组中找到的第一个函数。

      我建议家庭的mysite/urls.py 的网址为r'^$',注册的网址为r'^registration/$'

      urlpatterns = patterns('', url(r'^registration/$', views.registration, name='registration'), url(r'^$', views.index, name='index'), )

      【讨论】:

      • 这似乎不起作用。当我进行此更改时,两条路径现在只需将我带到 mysite/ 页面(index() 函数)
      • 我编辑了我的答案,尝试在mysite/urls.py上使用以下配置,
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2020-07-21
      相关资源
      最近更新 更多