django 1.3 - правильный способ определения необязательных параметров для представления на основе классов - PullRequest
3 голосов
/ 05 марта 2012

Я просто пачкаю руки представлениями на основе классов.

Как правильно передать значения по умолчанию для необязательных параметров в мое представление на основе классов?
Например, я был ранеев основном это делается:
http://lethain.com/using-optional-parameters-in-django-urls/

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

Ответы [ 3 ]

4 голосов
/ 05 марта 2012

Аргументы URL хранятся в self.args и self.kwargs.Есть несколько примеров в разделе динамическая фильтрация документов общего вида на основе классов.

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

my_value = self.kwargs.get('key', 'default_value')
1 голос
/ 04 апреля 2012

Для тех, кто задумывается над этим вопросом, вот что я делаю в 1.3. Это почти так же, как я делал это в 1.1 (за исключением более подробного). (т. е. как описано в ссылке на мой вопрос)

например соответствующие строки в urls.py могут выглядеть как

...
# pass a default value of page = 1 for optional parameter page
url(r'^obj/list$', ObjListView.as_view(), {'page': 1}, name='obj_list'),
url(r'^obj/list/page(?P<page>[0-9]+)$', ObjListView.as_view(), name='obj_list'),
...
# both new and edit use the same class, but edit obviously needs an id for the object.
# i should probably just be using pk but whatever.
url(r'^obj/new$', ObjEditView.as_view(), name='obj_edit'),
url(r'^obj/edit/(?P<obj_id>[0-9]+)/$', ObjEditView.as_view(), name='obj_edit'), 

в случае класса ObjEditView, описанного выше, у нас может быть что-то вроде этого

class ObjEditView(UpdateView):
    ...
    form_class = ObjForm
    model=Obj
    ...

    # this puts our obj in self.object
    def get_object(self):
        # if the obj exists, intialize our variables with values from the obj instance
        # if it is a new obj, intialize accordingly
        try:
            obj = Obj.objects.get(id = self.kwargs['obj_id'])       
        except (KeyError, ObjectDoesNotExist):
            obj = Obj()

        return obj

Как следствие моего вопроса к Alasdair в комментариях выше, порядок выполнения для различных функций внутри классов обычно соответствует порядку, который они есть в документации. то есть в UpdateView get_object () предшествует get_initial ()

0 голосов
/ 27 марта 2012

Отчасти связано с этой проблемой.Я искал, как получить параметры URL, используя представления на основе классов, чтобы добавить дополнительный контекст.Вы можете сделать что-то вроде этого:

url(r'^param1/(?P<param1>\d+)/param2/(?P<param2>\d+)/$', ClassDetailView.as_view())

, а затем на ваш взгляд:

def get_context_data(self, **kwargs):
    context = super(ClassDetailView, self).get_context_data(**kwargs)
    context['param1'] = Model.objects.get(pk=self.kwargs['param1'])
    context['param2'] = Model.objects.get(pk=self.kwargs['param2'])
    return context

Тогда в ваших шаблонах вы будете иметь {{param1}} и {{param2}}доступные вам объекты.

Я новичок в этом, поэтому не стесняйтесь взломать это, если есть лучший способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...