Python Django can';进入存档页后,我无法进入索引页
当我单击“主页”时,我希望我将被重定向到Python Django can';进入存档页后,我无法进入索引页,python,django,Python,Django,当我单击“主页”时,我希望我将被重定向到index.html 但是在我访问我的归档页面(journal.html)之后(类似于“/journal/2014/01”,这是来自db的查询) 我不能进入索引页或其他地方,只能在/journal/Year/Month或/journal/Year之类的页面上 因为当我尝试访问index.html时,它会将我重定向到/journal/Year/Month/index.html 为什么? My URL.py: urlpatterns = patterns(
index.html
但是在我访问我的归档页面(journal.html
)之后(类似于“/journal/2014/01”,这是来自db的查询)
我不能进入索引页或其他地方,只能在/journal/Year/Month
或/journal/Year
之类的页面上
因为当我尝试访问index.html
时,它会将我重定向到/journal/Year/Month/index.html
为什么?
My URL.py:
urlpatterns = patterns(
'',
url(r'^$', index),
url(r'^index.html$', index),
url(r'^journal.html$', journal),
url(r'^contact.html$', contact),
url(r'^about.html$', about),
(r'^journal/(\d{4})$', journal),
(r'^journal/(\d{4})/(\d{2})$', journal),
url(r'^auth.html$', auth),
url(r'^logout.html$', logx),
url(r'^admin/', include(admin.site.urls)),
# develop
url(r'^Observations/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': MEDIA_ROOT}),
)
您的
url.py
或views.py
中没有任何内容会导致这种情况
我假设如果您在浏览器中键入{mysite}/index.html
,它会按预期进入主页
…只有当你在日记页面上点击“主页”链接时,它才会转到错误的url
听起来您的HTML中链接的href
有问题。。。您的链接可能看起来像:
它缺少前面的斜杠,因此url相对于当前url进行处理,即,如果您在/journal/2014/01
上,则单击该链接将带您进入/journal/2014/01/index.html
避免此类问题的最佳方法是命名URL并使用
请注意,Django url模式非常复杂,因此您应该将
字符转义为\。
此外,利用regex,您只需要一个url模式就可以匹配索引
视图中要接受的所有url。对于日志
视图也是如此
因此,您的url.py
如下所示:
urlpatterns = patterns(
'',
url(r'^(?:index\.html)?$', index, name='index'),
url(r'^contact\.html$', contact, name='contact'),
url(r'^about\.html$', about, name='about'),
url(r'^journal(?:\.html$|/(\d{4})(?:/(\d{2}))?$)', journal, name='journal'),
url(r'^auth\.html$', auth, name='auth'),
url(r'^logout\.html$', logx, name='logout'),
url(r'^admin/', include(admin.site.urls)),
# develop
url(r'^Observations/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': MEDIA_ROOT}),
)
并相应地更新视图代码:
def journal(request, year=None, month=None):
# print args
if request.user.is_authenticated():
obss = Obs.objects.all()
if year is not None:
obss = obss.filter(date__year=year)
if month is not None:
obss = obss.filter(date__month=int(month))
ar_obs = Obs.objects.all()
archive = create_archive_data(ar_obs)
return render_to_response('journal.html', {'obss': obss, 'user': request.user,
'archive_counts': archive})
else:
state = "Please log in below..."
# return HttpResponseRedirect('auth.html', {'state': state})
return render_to_response('auth.html', {'state': state})
此外,与其在每个需要的视图中手动执行is\u authenticated
检查和随后的登录重定向,不如使用Django的login\u required
decorator:这是一个很好的答案,但你为什么要在URL的末尾添加
.html
?Django的长度使它更容易支持漂亮的URL,但这样破坏它似乎是一种耻辱。是我错过了一些好处,还是你只是选择在OP中忽略了它?@PeteTinkler是的,我同意在URL中包含.html
是丑陋的,没有必要,但我认为OP有这样做的理由(可能将现有网站转换为Django)谢谢。是的。我换成了。谢谢你的建议@Victor如果这提供了您需要的信息,请接受答案
url(r'^journal(?:\.html$|/(?P<year>\d{4})(?:/(?P<month>\d{2}))?$)', journal, name='journal'),
def journal(request, year=None, month=None):
# print args
if request.user.is_authenticated():
obss = Obs.objects.all()
if year is not None:
obss = obss.filter(date__year=year)
if month is not None:
obss = obss.filter(date__month=int(month))
ar_obs = Obs.objects.all()
archive = create_archive_data(ar_obs)
return render_to_response('journal.html', {'obss': obss, 'user': request.user,
'archive_counts': archive})
else:
state = "Please log in below..."
# return HttpResponseRedirect('auth.html', {'state': state})
return render_to_response('auth.html', {'state': state})