Skip to main content
 首页 » 编程设计

python之Django 中的多个 URL/ View

2024年10月25日42softidea

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

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

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

/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}) 

这是给我的错误

ImportError at /contact
No module named contact

请您参考如下方法:

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

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

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