在Django 1.9中使用URL

时间:2016-06-17 14:39:34

标签: django django-1.9

我正在使用Django 1.9.7和Python 3.5.1

我对Django很新,构建一个简单的应用程序。我目前遇到了网址问题。

我想有以下行为: 如果用户访问http:... / entry / 2016/03,他会看到2016年3月的数据 但如果用户得到t:http:... / entry然后而不是获得404,他应该被重定向到http:... / entry / 2016/06(假设我们在2016年6月)。

目前,我是这样做的:

url(r'^entry/$', Entry.as_view(), name='entry0'),
url(r'^entry/(?P<year>\d{4})/(?P<month>\d{1,2})/$', Entry.as_view(), name='entry'),

并且视图定义为:

def get(self, request, year=datetime.datetime.year, month=datetime.datetime.month):

在模板中,我有:

<li><a href="{% url 'entry' year month%}">Entry</a></li> 

问题是,当我进入/进入时,我收到以下错误:

NoReverseMatch at /entry/

Reverse for 'entry' with arguments '(<attribute 'year' of 'datetime.date' objects>, <attribute 'month' of 'datetime.date' objects>)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['entry/(?P<year>\\d{4})/(?P<month>\\d{1,2})/$']

但是,进入/ entry / 2016/06可以正常工作。

最简洁的方法是什么?我可以通过一个网址和视图实现这一目标吗?

祝你好运

让 - 诺尔

根据建议,我修改了一下视图:

def get(self, request, year=None, month=None):
    if year is None:
        year = datetime.datetime.today().year
    if month is None:
        month = datetime.datetime.today().month        
    context = {'current_date': datetime.datetime.now(),
               'year': year,
               'month': month,
               }

网址保持不变:

url(r'^entry/$', Entry.as_view(), name='entry0'),
url(r'^entry/(?P<year>\d{4})/(?P<month>\d{1,2})/$', Entry.as_view(), name='entry'),

模板只指向空网址:

<li><a href="{% url 'entry0' %}">Entry</a></li> 

这似乎有效;当点击模板中的链接时,我被发送到默认值;但如果我在网址中指定了一个值,我就会被发送到正确的值。

我的最后一个问题是:我不能在一个视图和网址中这样做吗?基本上,当使用/ entry时,参数将设置为None,而在指定它们时,它们会在视图中被接收。

非常感谢

让 - 诺尔

3 个答案:

答案 0 :(得分:1)

您传递的属性没有任何值作为默认值。你应该这样做:

from datetime import datetime as dt

def get(self, request, year=None, month=None):
    if year is None:
        year = dt.today().year
    if month is None:
        month = dt.today().month

要在模板中使用此功能:

<li><a href="{% url 'entry0' %}">Entry</a></li> 

答案 1 :(得分:0)

您的网址模板标记应该获取关键字参数而不仅仅是args

<li><a href="{% url 'entry' year=year month=month%}">Entry</a></li> 

答案 2 :(得分:0)

好的,首先要做的事情。你的整个逻辑不是清洁或pythonic。 您需要1个网址,1个视图和1个模板

url(r'^entry/(?P<year>\d{4})/(?P<month>\d{1,2})/$', Entry.as_view(),name='entry')

定义你的观点

def get(self, request, year=None, month=None):

现在,在您的视图中检查您的参数是否具有值无,

if (year is None) and (month is None) :
# set today values
mplah mplah mplah ..... 希望你明白这一点......