2016-06-17 3 views
0

Я использую Django 1.9.7 с Python 3.5.1Использование URL в Django 1.9

Я довольно новичок в Django, создавая простое приложение. В настоящее время у меня проблема с URL-адресами.

Я хотел бы иметь следующее поведение: если пользователь получает HTTP: .../запись/2016/03 он видит данные за март 2016 года но если пользователь получает т: HTTP: .../запись затем вместо того, чтобы получать 404, он должен быть перенаправлен на http: .../entry/2016/06 (предположим, что мы в июне 2016 года).

В настоящее время, вот как я это сделал:

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})/$'] 

Однако получение/ввод/2016/06 работает правильно.

Какой будет самый чистый способ заставить это работать? Могу ли я достичь этого с помощью одного URL-адреса и представления?

С наилучшими пожеланиями

Жан-Ноэль

#

Как было предложено, я изменил чуток мнение:

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-адреса остаются прежними:

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'), 

шаблон указывает только на пустой URL:

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

Это похоже на работу; при нажатии на ссылку в шаблоне меня отправляют значения по умолчанию; но если я укажу значение в URL-адресе, меня отправят на правильные значения.

Мой последний вопрос: не могу ли я сделать это в одном виде и URL-адресе? В принципе, при использовании/entry параметры будут установлены на None, тогда как при их указании они будут получены в представлении.

Большое спасибо

Жан-Ноэль

+0

Ваши переменные в шаблоне имеют nge, как их установить? – RemcoGerlich

ответ

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> 
+0

Но если эта ошибка исходит из его шаблона, то это даже не ошибка. По-видимому, его переменные года и месяца в шаблоне * также * те методы из datetime.datetime. – RemcoGerlich

+0

@RemcoGerlich у него уже есть именованный url 'entry0', он должен использовать это вместо этого. –

+0

@RemcoGerlich Исходная проблема заключается в том, что OP неправильно использовал 'datetime.datetime.year' и' datetime.datetime.month' в качестве значений по умолчанию, которые затем передаются в шаблон по представлению. Как только метод 'get()' был исправлен, как предлагает Моисей, будет нормально использовать '{% url 'entry' year month%}'. – Alasdair

0

Ваш URL шаблонный тег должен получить ключевое слово арг вместо того, чтобы просто арг

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

Это не устранит проблему, нормально передавать аргументы в тег url. – Alasdair

0

OK, первые вещи первый. Вся ваша логика не чистая и не пифоническая. Вам необходимо 1 URL, 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): 

Теперь внутри вашего чека зрения, если ваши Титулы не имеют значения None,

if (year is None) and (month is None) : 
# set today values 

mplah mplah mplah ..... надеюсь, что вы получите точку ....

+0

Да, я проверил этот раздел, но он использует несколько URL-адресов, в то время как я хотел бы использовать только один, и отложить до представления проверку того, были ли предоставлены параметры. – jnc

Смежные вопросы