【问题标题】:Multiple URLs/Views in DjangoDjango 中的多个 URL/视图
【发布时间】:2014-09-30 15:08:24
【问题描述】:

假设我有以下文件夹结构:

mysite
   - mysite
       - views.py
       - urls.py
   - books
       - views.py
       - urls.py
   - contact
       - views.py
       - urls.py

我想将视图和 url 分开以使代码更易于处理。到目前为止,我只是将视图捆绑到一个文件中,并将 URL 捆绑到另一个文件中,都在“mysite”文件夹中,但我觉得这是错误的做法。我首先尝试将 url“/contact”指向联系人文件夹中的 urls.py 文件,然后该 url 将指向 /contact/views.py 文件中的视图(称为“contact”)。

/mysite/urls.py

from django.conf.urls import include, patterns, url
from mysite import views
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^contact/$', include('contact.views.contact')),
)

/contact/urls.py

from django.conf.urls import include, patterns, url
from mysite import views
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^contact/$', views.contact),
)

/contact/views.py

from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render

def contact(request):
    errors = []
    if request.method == 'POST':
        if not request.POST.get('subject', ''):
            errors.append('Enter a subject.')
        if not request.POST.get('message', ''):
            errors.append('Enter a message.')
        if request.POST.get('email') and '@' not in request.POST['email']:
            errors.append('Enter a valid e-mail address.')
        if not errors:
            send_mail(
                request.POST['subject'],
                request.POST['message'],
                request.POST.get('email', 'noreply@example.com'),
                ['siteowner@example.com'],
            )
            return HttpResponseRedirect('/contact/thanks/')
    return render(request, 'contact_form.html',
        {'errors': errors})

这是给我的错误

/contact 处的 ImportError
没有名为contact的模块

【问题讨论】:

    标签: python django


    【解决方案1】:

    您的 include 应该指向 urls.py 文件,而不是视图。

    另外,您不能在主 urlconf 中终止正则表达式(使用 $),否则将没有任何匹配项。

    url(r'^contact/', include('contact.urls')),
    

    【讨论】:

    • 谢谢你,这取得了进步。但是,我现在在 /contact 处收到 AttributeError - 'module' 对象没有属性 'contact'。我认为我不需要 models.py 文件中的任何内容吗?
    • 因为您的contact/urls.py 文件导入了错误的视图:它是从mysite 导入,而不是从联系人导入。
    • 是的,刚刚注意到,我现在收到了 404。我的正则表达式一定是错的地方
    • 修复了!我有错误的网址。它正在寻找 /contact/contact,因为我在两个 URL 文件中都有相同的内容......我更改了联系人文件夹中的 url.py 文件以匹配“url(r'^$',views.contact)”和成功了!
    • 酷。请注意,如果您使用 Django 表单,您的联系人视图本身可以大大简化。
    【解决方案2】:

    您需要在每个子文件夹中都有一个__init__.py 文件才能进行导入。它不需要任何东西。它只需要存在。

    Package documentation

    【讨论】:

    • 是的,他们在那里,我运行了“python manage.py startapp contact”,它为我提供了 init、admin、models、tests、urls、views 和一个迁移文件夹。
    【解决方案3】:

    在@Daniel Roseman 的帮助下,将 /contact 指向联系人文件夹中的 urls.py 文件工作正常。

    然后我最终匹配了“/contact/contact”,因为第二个 urls.py 文件只需要匹配它的根:

    /mysite/urls.py

    url(r'^contact/', include('contact.urls')),
    

    /contact/urls.py

    urlpatterns = patterns('',
        url(r'^$', views.contact),
    )
    

    【讨论】:

      猜你喜欢
      • 2011-11-17
      • 2014-08-08
      • 1970-01-01
      • 2016-04-26
      • 2021-10-01
      • 2012-07-22
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      相关资源
      最近更新 更多