用简单的英语,什么是Django通用视图?

all*_*ode 20 python django django-generic-views

本页的前两段解释了通用视图应该让我的生活更轻松,更少单调,让我对女性更具吸引力(我构成了最后一个):

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

我都是为了改善我的生活,但通用观点实际上做了什么?似乎有很多流行语被抛出,这比他们解释的更令人困惑.

通用视图类似于Ruby on Rails中的scaffolding吗?介绍中的最后一个要点似乎表明了这一点.这是一个准确的陈述吗?

TM.*_*TM. 20

Django通用视图只是视图函数(常规的旧python函数),它们在Web应用程序中非常常见.

根据您正在构建的应用程序类型,它们可以帮助您避免编写大量非常简单的视图.

例如,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))
Run Code Online (Sandbox Code Playgroud)

为此:

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

# views.py doesn't need any code for this view anymore
Run Code Online (Sandbox Code Playgroud)

对于常见操作,还有更复杂的通用视图,例如"显示模型列表"或"向db添加模型".

此外,由于通用视图只是函数,因此当您需要与通用案例略有不同的内容时,可以在自己的视图函数中调用它们来执行"大部分工作".

  • 谢谢,TM.他们应该将此添加到文档:).我不是完全出售通用视图.涉及direct_to_template的示例不会节省太多代码(2行),您仍然需要手动指定模板.糟糕的是它使你的应用程序更难理解,因为它需要我更多地了解Django而不是完成这个简单任务所必需的. (2认同)

vdb*_*oor 5

通用视图允许您编写更短的代码。

相比:

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})
Run Code Online (Sandbox Code Playgroud)

和:

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")
    )
Run Code Online (Sandbox Code Playgroud)

就像你的普通视图一样,它们只是普通的函数。如果你愿意,可以在 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
Run Code Online (Sandbox Code Playgroud)