Django: как использовать голые классы в urlpatterns urls.py?

Я где-то видел такую ​​конструкцию urls.py:

from project.f import SomeClass

urlpatterns = patterns('',
   (r'^url/$', SomeClass()),
)

Нигде в http://docs.djangoproject.com/en/dev/topics/http/urls/ Я могу узнать, что это значит, обычно запись выглядит так:

   (r'^url/(?P<some_id>\d+)/$', 'project.views.some_view'),

Может кто-нибудь объяснить мне, как работает добавление только SomeClass()?

Конструкция SomeClass() работает, если она не имеет параметров, но я хотел, чтобы там были параметры, поэтому я сделал что-то вроде этого:

   (r'^url/(?P<some_id>\d+)/$', SomeClass()),

и изменил SomeClass, который был:

class SomeClass(OtherClass):

    def items(self):
        return MyItems.objects.all()

to:

class SomeClass(OtherClass):

    def items(self, some_id):
        return MyItems.objects.filter(pk=some_id)

Теперь при посещении /url/ я получаю:

TypeError at /url/12/

items() takes exactly 2 arguments (1 given)

поэтому похоже, что аргументы не передаются. Если бы я попытался вставить urls.py:

   (r'^url/(?P<some_id>\d+)/$', SomeClass(some_id)),

Я получил:

NameError at /url/12/

name 'some_id' is not defined

Как сделать правильные URL-шаблоны в этой настройке?


person ria    schedule 08.12.2009    source источник


Ответы (1)


Все, о чем заботится urlconf, это то, что значение для представления является вызываемым. Вызываемые объекты могут быть экземплярами класса, если класс определяет метод __call__. Именно этот метод должен принимать параметры из URL-адреса — вы не объяснили, что такое ваш метод «элементов», но предположительно он вызывается из __call__.

person Daniel Roseman    schedule 08.12.2009
comment
+1 за все, что заботит urlconf, это то, что значение для представления является вызываемым. Я собирался опубликовать то же самое. - person mikej; 08.12.2009
comment
очень интересно - не уверен, что это когда-нибудь пригодится, но я рад это узнать :) - person Jiaaro; 08.12.2009