Поиск…


Вступление

Общие представления представляют собой представления, которые выполняют определенное предопределенное действие, например создание, редактирование или удаление объектов, или просто отображение шаблона.

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

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

замечания

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

Так, если вы всегда будете использовать их? Нет. Они имеют смысл только в том случае, если ваши задачи достаточно стандартизированы (загрузка, редактирование, удаление объектов) и более повторяющиеся ваши задачи. Использование одного определенного общего представления только один раз, а затем переопределить все его методы для выполнения очень специфических задач, может не иметь смысла. Вам может быть лучше с функциональным представлением здесь.

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

Минимальный пример: функциональные и общие представления

Пример для функционального представления для создания объекта. Исключая комментарии и пустые строки, нам нужно 15 строк кода:

# imports
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect

from .models import SampleObject
from .forms import SampleObjectForm

# view functioon
def create_object(request):
    
    # when request method is 'GET', show the template
    if request.method == GET:
        # perform actions, such as loading a model form
        form = SampleObjectForm()
        return render_to_response('template.html', locals())
    
    # if request method is 'POST', create the object and redirect
    if request.method == POST:
        form = SampleObjectForm(request.POST)

        # save object and redirect to success page if form is valid
        if form.is_valid:
            form.save()
            return HttpResponseRedirect('url_to_redirect_to')

        # load template with form and show errors
        else:
            return render_to_response('template.html', locals())

Пример для «Общего представления на основе классов» для выполнения одной и той же задачи. Нам нужно всего 7 строк кода для достижения той же задачи:

from django.views.generic import CreateView

from .models import SampleObject
from .forms import SampleObjectForm

class CreateObject(CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

Настройка общих представлений

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

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

def create_object(request):
    page_title = 'My Page Title'

    # ...

    return render_to_response('template.html', locals())

Это сложнее (или: counter-intutitive) для достижения общих представлений. Поскольку они основаны на классах, вам необходимо переопределить один или несколько методов класса для достижения желаемого результата. В нашем примере нам нужно переопределить метод get_context_data класса следующим образом:

class CreateObject(CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

    def get_context_data(self, **kwargs):
        
        # Call class's get_context_data method to retrieve context
        context = super().get_context_data(**kwargs) 
        
        context['page_title'] = 'My page title'
        return context

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

Общие представления с Mixins

Истинная сила общих представлений разворачивается, когда вы объединяете их с Mixins. Mixin - это просто другой класс, определенный вами, чьи методы могут быть унаследованы вашим классом вида.

Предположим, вы хотите, чтобы каждое представление отображало дополнительную переменную 'page_title' в шаблоне. Вместо того, чтобы переопределять метод get_context_data каждый раз, когда вы определяете представление, вы создаете mixin с этим методом и позволяете вашим представлениям наследовать из этого mixin. Звучит более сложно, чем на самом деле:

# Your Mixin
class CustomMixin(object):
    
    def get_context_data(self, **kwargs):
        
        # Call class's get_context_data method to retrieve context
        context = super().get_context_data(**kwargs) 
        
        context['page_title'] = 'My page title'
        return context

# Your view function now inherits from the Mixin
class CreateObject(CustomMixin, CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

# As all other view functions which need these methods
class EditObject(CustomMixin, EditView):
    model = SampleObject
    # ...

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow