Django сопоставление URL? - PullRequest
       8

Django сопоставление URL?

1 голос
/ 02 ноября 2011

Новичок в Джанго и Питоне. Попытка получить пример кода календаря и запустить, но возникают проблемы с отображением URL. Когда я пытаюсь запустить страницу администратора (или любую другую страницу), я получаю:

ViewDoesNotExist at /

Tried main in module cal. Error was: 'module' object has no attribute 'main'

Request Method:     GET
Request URL:    http://127.0.0.1:8000/
Django Version:     1.3.1
Exception Type:     ViewDoesNotExist

и вот мои шаблоны URL:

(r"^(\d+)/$", "main"),
(r"", "main"),
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/', include(admin.site.urls)),

Я смущен, потому что мне кажется, что функция "main" действительно существует в views.py, как показано ниже. Любая помощь с благодарностью:

import time
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import get_object_or_404, render_to_response

from dbe.cal.models import *

mnames = "January February March April May June July August September October November December"
mnames = mnames.split()


@login_required
def main(request, year=None):
"""Main listing, years and months; three years per page."""
# prev / next years
if year: year = int(year)
else:    year = time.localtime()[0]

nowy, nowm = time.localtime()[:2]
lst = []

# create a list of months for each year, indicating ones that contain entries and current
for y in [year, year+1, year+2]:
    mlst = []
    for n, month in enumerate(mnames):
        entry = current = False   # are there entry(s) for this month; current month?
        entries = Entry.objects.filter(date__year=y, date__month=n+1)

        if entries:
            entry = True
        if y == nowy and n+1 == nowm:
            current = True
        mlst.append(dict(n=n+1, name=month, entry=entry, current=current))
    lst.append((y, mlst))

return render_to_response("cal/main.html", dict(years=lst, user=request.user, year=year,
                                               reminders=reminders(request)))

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Сообщение об ошибке говорит вам, что функция main не существует в модуле cal - это правильно, она существует в модуле cal.views.

Если вы измените свой шаблон URL на следующий, он должен работать:

(r"^(\d+)/$", "cal.views.main"),
# (r"", "cal.views.main"),

Я закомментировал r"" URL выше, потому что это улов всей ссылки. Он отображается над вашим шаблоном для URL входа в систему, поэтому ваше представление main обрабатывает URL журнала /accounts/login/. Представление main использует декоратор login_required, вызывая цикл перенаправления.

1 голос
/ 02 ноября 2011

Ответ Alasdair правильный. Я просто хочу добавить бонус от: https://docs.djangoproject.com/en/1.3/intro/tutorial03/#simplifying-the-urlconfs

Вы можете объявить это таким образом для большего удобства :):

urlpatterns = patterns('cal.views',
                       (r'^(\d+)/$', 'main'),
                       (r'', 'main'),
)
...