Django: представления классов, общие представления и т. Д

#python #django

#python #django

Вопрос:

Я возвращаюсь к Django после краткого знакомства с версией 1.2, и теперь в версии 1.3 предпочтительным подходом к представлениям, похоже, является использование классов.

Имея в виду стиль кода, удобство сопровождения и модульность: когда я должен использовать классы, а когда функции? Должен ли я всегда расширяться из представлений общего класса (кажется, в использовании TemplateView нет вреда), или я должен использовать свои собственные вызываемые объекты view?

Заранее спасибо.

Ответ №1:

Я считаю, что представления на основе классов помогают поддерживать мой код читабельным и оптимизированным.

Возьмем, к примеру, примерное (основанное на функциях) представление из документации формы:

 def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })
  

В эквиваленте на основе классов исчезает шаблонный код и неприятные вложенные ifs:

 class Contact(FormView):
    template_name = 'contact.html'
    form_class = ContactForm
    success_url = '/thanks/'

    def form_valid(self, form):
        # Process the data in form.cleaned_data
        return super(Contact, self).form_valid(form)
  

Кроме того, хотя вы всегда можете смешивать и сопоставлять представления на основе функций и классов, я нахожу, что смешивание стилей в одном и том же приложении Django имеет тенденцию выглядеть довольно беспорядочно. Итак, как только у меня появится несколько представлений, которые действительно выиграют от перехода на классовую основу, переключить все это будет несложно.

Ответ №2:

На мой взгляд, есть два случая необходимости в представлениях на основе классов (-generic):

  • Вам действительно нужна общая функциональность в ваших представлениях и немного больше.
  • Вы пишете повторно используемое приложение Django и хотите, чтобы другие могли расширять ваши представления.

Для всего остального используйте то, с чем вам удобнее всего. Как вы сказали, вы в принципе готовы пойти с расширением от TemplateView и перезаписать соответствующие методы, хотя вы также могли бы использовать подход, основанный на функциях (и вам придется самостоятельно обрабатывать вызовы шаблонов рендеринга). В конце концов, это зависит от вас.

РЕДАКТИРОВАТЬ: Еще одно преимущество представлений на основе классов заключается в том, что оно позволяет более четко разделять ваш код в соответствии с request.method и даже возвращает 405 Method Not Allowed коды ответа, когда используется неправильный метод. Таким образом, вам вообще не нужно иметь дело со строками типа if request.method=='POST' or if request.method=='GET' и просто расширять метод post or get .

Комментарии:

1. Спасибо, что нашли время ответить, вопрос, похоже, никому не понравился: P. Если нет ВЕСКИХ причин идти тем или иным путем, я приму решение в каждом конкретном случае, стараясь соблюдать согласованность.