Python Django中的多个URL/视图

Python Django中的多个URL/视图,python,django,Python,Django,假设我有以下文件夹结构: mysite - mysite - views.py - urls.py - books - views.py - urls.py - contact - views.py - urls.py 我想分离视图和URL,使代码更易于处理。到目前为止,我只是将视图绑定到一个文件中,将URL绑定到另一个文件中,这两个文件都在“mysite”文件夹中,但我觉得这样做是错误的。我

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

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

/mysite/url.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')),
)
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),
)
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})
url(r'^contact/', include('contact.urls')),
urlpatterns = patterns('',
    url(r'^$', views.contact),
)
/contact/url.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')),
)
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),
)
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})
url(r'^contact/', include('contact.urls')),
urlpatterns = patterns('',
    url(r'^$', views.contact),
)
/contact/views.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')),
)
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),
)
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})
url(r'^contact/', include('contact.urls')),
urlpatterns = patterns('',
    url(r'^$', views.contact),
)
这是给我的错误

输入/联系信息
没有名为contact的模块


您需要在每个子文件夹中都有一个
\uuuu init\uuuuuuuuuy.py
文件,以便导入工作。它不需要任何东西;它只需要存在


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

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

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

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

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

/mysite/url.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')),
)
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),
)
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})
url(r'^contact/', include('contact.urls')),
urlpatterns = patterns('',
    url(r'^$', views.contact),
)
/contact/url.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')),
)
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),
)
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})
url(r'^contact/', include('contact.urls')),
urlpatterns = patterns('',
    url(r'^$', views.contact),
)

是的,它们在那里,我运行了“python manage.py startap contact”,它给了我init、admin、models、tests、url、view和migrations文件夹。谢谢,这是一个改进。但是,我现在在/contact处获得AttributeError-“module”对象没有属性“contact”。我想我不需要models.py文件中的任何内容,是吗?因为你的contact/url.py文件导入了错误的视图:它是从mysite导入的,而不是contact。是的,我刚刚注意到,我现在得到了一个404。我的正则表达式一定是哪里搞错了!我的网址错了。它正在寻找/contact/contact,因为我在两个URL文件中都有相同的内容。。。我更改了联系人文件夹中的url.py文件以匹配“url(r'^$',views.contact)”,它成功了!酷。请注意,如果使用Django表单,联系人视图本身可以大大简化。