Подтвердить что ты не робот

На простом английском языке, какие общие представления Django?

Первые два абзаца этой страницы объясняют, что общие представления должны сделать мою жизнь проще, менее монотонной и сделать меня более привлекательной для женщин (я составил эту последнюю):

https://docs.djangoproject.com/en/1.4/topics/generic-views/

Я все для улучшения своей жизни, но что на самом деле делают общие представления? Кажется, что вокруг разбросано много модных слов, которые путают больше, чем объясняют.

Существуют ли общие представления, похожие на строительные леса в Ruby on Rails? Кажется, это указывает на последний пункт в вводной строке. Это точная формулировка?

4b9b3361

Ответ 1

Общие представления Django - это просто функции просмотра (обычные старые функции python), которые делают вещи, которые очень распространены в веб-приложениях.

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

Например, общий вид direct_to_template просто отображает шаблон с помощью RequestContext (что означает, что шаблон имеет доступ к информации о запросе, например, текущий пользователь и т.д.).

В качестве простого примера вы можете перейти от написания таких вещей:

# urls.py
url('^some-url/$', some_view)

# views.py
def some_view(request):
    return render_to_response('template_name.html', context_instance=RequestContext(request))

Для этого:

# urls.py
url('^some-url/$', direct_to_template, {'template': 'template_name.html'})

# views.py doesn't need any code for this view anymore

Существуют также более сложные общие представления для общих действий, таких как "отображение списка моделей" или "добавление модели в db".

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

Ответ 2

Общие представления позволяют писать гораздо более короткий код.

Для сравнения:

from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render_to_response, get_object_or_404, redirect
from myapp.models import Context

def edit(request, item_id):
    object = get_object_or_404(Context, pk=item_id)

    if request.method == 'POST':
        form = ContextForm(request.POST, instance=object)
        if form.is_valid():
            form.save()
            return redirect('myapp-context-index')
    else:
        form = ContextForm(instance=object)

    return render_to_response("myapp/context/edit.html", {'object': object, 'form': form})

с:

from django.core import urlresolvers
from django.views.generic.create_update import update_object
from myapp.models import Context

def edit(request, item_id):    
    return update_object(request,
        object_id=item_id,              
        form_class=ContextForm,            
        template_name="myapp/context/edit.html",
        post_save_redirect=urlresolvers.reverse("myapp-context-index")
    )

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

Как БОНУС, вы также получаете:

  • Проверка подлинности входа в систему (pass login_required=True)
  • Сообщение о статусе успеха от django.contrib.messages.
  • Меньше кода для проверки ошибок.
  • По умолчанию ModelForm, когда вы указываете параметр model вместо form_class.

template_name имеет значение по умолчанию "appname/model_form.html", но это слишком много для меня.


Вот класс формы, который они разделяют:

class ContextForm(forms.ModelForm): 
    """The form for a context"""
    class Meta:
        model = Context
        exclude = ('collection',)

    def save(self, commit=True):
        """Overwritten save to force collection_id to a value"""
        model = super(ContextForm, self).save(commit=False)
        model.collection_id = 1
        if commit:
            model.save()
        return model

Ответ 3

Чтобы ответить на ваш второй вопрос: нет, общие представления не связаны с лесами в RoR. Леса, как видно из названия, сродни генерации кода. Общие представления - это что-то еще.

Мое основное использование общего представления - это замена более высоких уровней основных функций render_to_response на более высокий уровень. Вот как вы могли бы написать простой вид с помощью render_to_response:

def my_view(request):
    return render_to_response('my_template.html')

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

Вместо этого я предпочитаю использовать общий вид:

def my_view(request):
    return direct_to_template(request, template='my_template.html')

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

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