Подклассы представлений на основе классов Django? - PullRequest
1 голос
/ 04 марта 2012

Я пытаюсь исказить взгляды на новые классовые представления Джанго из 1.3.

Я немного прочитал:

Но единственное, чего я не видел в качестве примера или как это сделать, может ли несколько представлений создать подкласс общего класса «родитель», повторно используя данные оттуда? (Прошу прощения за мою общую номенклатуру)

Пример того, что я пытаюсь сделать:

class MyParentClass(TemplateView):
   def get(self, request, *args, **kwargs):
     session_data = request.session
     other_variables = foovars
     return self.render_to_response(context)

class MyChildClassOne(TemplateView):
    template_name = "template_one.htm"

    def get(self,request, *args, **kwargs):
      resultant_data = foodata
      return {'data' : resultant_data }


class MyChildClassTwo(TemplateView):
    template_name = "template_two.htm"

    def get(self,request, *args, **kwargs):
      other_data = foootherdata
      return {'data' : other_data }

Таким образом, единственное различие между двумя дочерними классами заключается в используемых ими шаблонах и возвращаемых «данных». Оба представления также будут возвращать session_data и other_variables из родительского класса, и, следовательно, не повторять «return session_data, other_variables» в каждом дочернем классе.

Ответы [ 2 ]

3 голосов
/ 12 сентября 2013

Во-первых, не переопределяйте метод вашего представления get. Это опасно по нескольким причинам, я не буду вдаваться в подробности.

Anmyway, вам нужен метод get_context_data, который возвращает контекстный dict, который передается в шаблон.

Итак, оба ваших дочерних представления должны выглядеть примерно так:

class ChildView(ParentView):
    template_name = "foo"
    def get_context_data(self, **kwargs):
        context = super(ChildView, self).get_context_data(**kwargs)
        context.update({
            'foodata': 'bardata',
        })
        return context

Но это в значительной степени то, как представления работают из коробки; почему вы думаете, что вам нужно создать подкласс из дополнительного пользовательского класса представления?

1 голос
/ 04 марта 2012

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

Пример:

class MyParentClass(TemplateView):
    def get(self, request, *args, **kwargs):
        session_data = request.session
        other_variables = foovars
        context['data'] = data
        return self.render_to_response(context)

class MyChildClassOne(MyParentClass):
    template_name = "template_one.htm"

    def get(self,request, *args, **kwargs):
        data = foodata
        return super(MyChildClassOne, self).get(request, args, kwargs)


class MyChildClassTwo(MyParentClass):
    template_name = "template_two.htm"

    def get(self,request, *args, **kwargs):
        data = foootherdata
        return super(MyChildClassTwo, self).get(request, args, kwargs)

Оба ваших дочерних классаНаследовать от MyParentClass, чей метод get автоматически устанавливает переменную с именем data в контекст.Значения данных предоставляются дочерними классами.После этого они вызывают метод get родителя для выполнения общих операций, включая рендеринг.

...