Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django can';进入存档页后,我无法进入索引页_Python_Django - Fatal编程技术网

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