Говоря простым языком, каковы общие взгляды Django? - PullRequest
20 голосов
/ 13 марта 2010

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 13 марта 2010

Общие представления 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

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

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

4 голосов
/ 14 июня 2010

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

Сравнить:

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, если хотите, но я нахожу это использование выше более понятным.

В качестве БОНУСА вы также получаете:

  • Проверка подлинности входа в систему (проход 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
2 голосов
/ 14 марта 2010

Чтобы ответить на ваш второй вопрос: нет, общие представления не связаны с лесами в 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')

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

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

...