Использование представлений классов для обработки информации? - PullRequest
1 голос
/ 20 августа 2011

Я экспериментировал с представлениями на основе классов в Django и пытаюсь написать простое представление на основе классов, которое обрабатывает определенную информацию в request, чтобы обработанная информация могла использоваться методом "обработчика".

Кажется, я не полностью понял, что говорят документы, и не уверен, должен ли это быть Mixin, общий вид или что-то еще. Я подумываю сделать такой урок:

class MyNewGenericView(View):

    redirect_on_error = 'home'
    error_message = 'There was an error doing XYZ'

    def dispatch(self, request, *args, **kwargs):
        try:
            self.process_information(request)
            # self.process_information2(request)
            # self.process_information3(request)
            # etc...
        except ValueError:
            messages.error(request, self.error_message)
            return redirect(self.redirect_on_error)
        return super(MyNewGenericView, self).dispatch(request, *args, **kwargs)

    def process_information(self, request):
        # Use get/post information and process it using
        # different models, APIs, etc.
        self.useful_information1 = 'abc'
        self.useful_information2 = 'xyz'

    def get_extra_info(self):
        # Get some extra information on something
        return {'foo':'bar'}

Это позволит кому-то написать вид, например:

class MyViewDoesRealWork(MyNewGenericView):
    def get(self, request, some_info):
        return render(request, 'some_template.html',
            {'info':self.useful_information1})

    def post(self, request, some_info):
        # Store some information, maybe using get_extra_info
        return render(request, 'some_template.html',
            {'info':self.useful_information1})

Является ли приведенный выше код правильным путем? Есть ли более простой / лучший способ сделать это? Будет ли это препятствовать использованию вышеуказанных функций в другом универсальном представлении (например, встроенном универсальном представлении)?

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

Кажется, я только что задал глупый вопрос.

Этого легко достичь, создав класс, обрабатывающий эту информацию:

class ProcessFooInformation(object):
    def __init__(self, request):
        self.request = request
    @property
    def bar(self):
        baz = self.request.GET.get('baz', '')
        # do something cool to baz and store it in foobar
        return foobar
    # etc...

Затем с использованием представлений функций старого стиля или новых представлений на основе классов:

def my_view(request):
    foo = ProcessFooInformation(request)
    # use foo in whatever way and return a response
    return render(request, 'foobar.html', {'foo':foo})

Я также сделал это более эффективным, используя ленивую оценку свойств.

Я адаптировал идеи из ленивого рецепта оценки свойств и комментариев для написания оболочки:

def lazy_prop(func):
    def wrap(self, *args, **kwargs):
        if not func.__name__ in self.__dict__:
            self.__dict__[func.__name__] = func(self, *args, **kwargs)
        return self.__dict__[func.__name__]
    return property(wrap)

Это оценивает значение упакованного метода только один раз за экземпляр и использует сохраненное значение при последующих вызовах. Это полезно, если свойство оценивается медленно.

0 голосов
/ 22 августа 2011

Посмотрите на это. отличный пример кода. http://www.stereoplex.com/blog/get-and-post-handling-in-django-views

...