2014-01-09 52 views
0

当我点击'Home'时,我预计我将被重定向到index.htmlDjango进入存档页面后无法进入索引页面

但是在我访问我的档案页面(journal.html)(类似“/杂志/ 2014/01”这是从数据库中查询)

我不能去索引页或其他地方,只在页面如/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}), 
) 

我的应用程序/ 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

有没有在你的urls.pyviews.py,可能会导致。

我假设如果您在浏览器中输入{mysite}/index.html,它会按预期转到主页?

...只有当你在一个杂志页面上,然后点击'首页'链接,它会去错误的网址?

这听起来像你有一个问题,在您的HTML链接href ...可能你的链接是这样的:<a href="index.html">Home</a>

它缺少前面的斜线这样的URL被视为相对到当前的URL,即如果你是/journal/2014/01然后单击该链接将带您到/journal/2014/01/index.html

避免这些种类的最佳方式问题(并避免,如果你改变任何网址在urls.py改变所有的模板)是命名您的网址,并使用Django's url tag

注意,Django的URL模式regular expressions所以你应该逃避.字符作为\.

此外,利用正则表达式,您只需要一个url模式即可匹配index视图所需的所有url。与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 groupsjournal网址:

url(r'^journal(?:\.html$|/(?P<year>\d{4})(?:/(?P<month>\d{2}))?$)', journal, name='journal'), 

并更新视图代码协议ingly:

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_authenticated检查,并随后登录手动重定向在每一个需要它的观点,你应该看看使用Django的login_required装饰:
https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.decorators.login_required

+0

一个很好的答案,但为什么你想在你的URL的末尾添加'.html'吗? Django的长度使它很容易支持漂亮的URL,看起来像这样毁了它似乎是一种耻辱。我是否错过了某些好处,或者您是否在OP中选择忽略它? – ptr

+0

@PeteTinkler是的,我同意这是丑陋的,没有必要在网址中有'.html',但我假设OP有这样做的理由(可能将现有的网站转换为Django) – Anentropic

+0

谢谢。这是Home。我更改为Home。感谢您的建议! – Viktor