在我进入存档页面后,Django无法访问索引页面

时间:2014-01-09 14:51:30

标签: python django

当我点击“主页”时,我希望我会被重定向到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})

1 个答案:

答案 0 :(得分:1)

urls.pyviews.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