2010-03-13 3 views
20

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

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

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

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

ответ

19

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

Благодаря ТМ. Они должны добавить это в документацию :). Хотя я не полностью продается на общих представлениях. Ваш пример с участием direct_to_template не сэкономит много кода (2 строки), и вам все равно придется вручную указать шаблон. Плохая часть заключается в том, что это затрудняет понимание вашего приложения, потому что для этого требуется, чтобы я знал больше о Django, чем это необходимо для выполнения этой простой задачи. – allyourcode

+1

@allyourcode С более сложными представлениями вы стоите сохранить намного больше кода, я выбрал очень быстрый пример. Кроме того, для тех представлений, которые работают с моделями, они автоматически выбирают шаблон на основе соглашения об именах (или его можно переопределить, если вы не хотите следовать соглашению). Подробнее см. Http://docs.djangoproject.com/en/1.1/ref/generic-views/. Я рекомендую писать некоторые из этих просмотров с нуля, а затем сравнивать. Ни один из них не является огромным и сложным, это всего лишь одна вещь для написания и отладки. –

+0

Еще раз спасибо, TM. Я уже смотрел документы для версии Django. – allyourcode

2

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

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

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

+0

Общие представления могут включать в себя создание кода, но они, похоже, играют аналогичную роль. В более ранней версии Rails можно было объявить строительные леса в контроллере (вид на джоргоне Django). Это позволит динамически дать контроллеру множество методов, которые позволят пользователю выполнять основные операции CRUD в соответствующей модели. – allyourcode

+0

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

+0

+1 для обозначения того, как общий вид может использоваться в вашей функции. Особенно вызов представления 'update_object' делает его лучшим для обоих миров для меня: ясный код и все еще короткий. – vdboor

4

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

Сравнить:

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)
  • Success статусное сообщение от 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 

 Смежные вопросы

  • Нет связанных вопросов^_^