#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. Если нет ВЕСКИХ причин идти тем или иным путем, я приму решение в каждом конкретном случае, стараясь соблюдать согласованность.