当我点击“主页”时,我希望我会被重定向到index.html
。
但是在我访问我的存档页面(journal.html
)之后(类似'/ journal / 2014/01'这是来自db的查询)
我无法访问索引页面或其他地方,只能访问/journal/Year/Month
或/journal/Year
等网页。
因为当我尝试前往index.html
时,它会将我重定向到/journal/Year/Month/index.html
为什么?
我的urls.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}),
)
我的app / views.py:
def index(request):
if request.user.is_authenticated():
return render_to_response('index.html', {'user': request.user})
else:
return render_to_response('index.html')
def journal(request, *args):
# print args
if request.user.is_authenticated():
obss = Obs.objects.all()
if len(args)>0:
year = args[0]
# print 'year', year
obss = obss.filter(date__year=year)
if len(args) > 1:
month = args[1]
obss = obss.filter(date__month=int(month))
# print 'month', 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})
答案 0 :(得分:1)
urls.py
或views.py
中没有任何内容可能导致此类内容。
我假设如果您在浏览器中输入{mysite}/index.html
,它会按预期进入主页?
...只有当您在日记页面上并单击“主页”链接时才会显示错误的网址?
听起来您的HTML中的href
链接存在问题...可能您的链接如下:<a href="index.html">Home</a>
?
它缺少前面的斜杠,因此网址被相对处理到当前网址,即如果您在/journal/2014/01
,则点击该链接将转到{{1} }
避免这类问题的最佳方法(并且如果您更改/journal/2014/01/index.html
中的任何网址,则无需更改所有模板)是为您的网址命名并使用Django's url
tag
请注意,Django网址格式为regular expressions,因此您应该将urls.py
字符转发为.
此外,利用正则表达式,您只需要一个网址格式来匹配您要为\.
视图接受的所有网址。 index
视图也是如此。
所以你的journal
会是这样的:
urls.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}),
)
我可能会进行进一步的更改,即对<a href="{% url 'index' %}">Home</a>
<a href="{% url 'journal' %}>Journal</a>
<a href="{% url 'journal' '2014' %}>Journal: 2014</a>
<a href="{% url 'journal' '2014' '06' %}>Journal: June 2014</a>
网址使用named groups:
journal
并相应地更新视图代码:
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})
检查和后续登录重定向,而应该使用Django的is_authenticated
装饰器:
https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.decorators.login_required