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表单,联系人视图本身可以大大简化。