本页的前两段解释了通用视图应该让我的生活更轻松,不那么单调,让我对女性更具吸引力(最后一段是我编的):
https://docs.djangoproject.com/en/1.4/topics/generic-views/
我完全是为了改善我的生活,但通用视图实际上有什么作用?似乎有很多流行语被抛出,这比他们解释的更令人困惑。
通用视图是否类似于 Ruby on Rails 中的脚手架?介绍中的最后一个要点似乎表明了这一点。这是一个准确的说法吗?
本页的前两段解释了通用视图应该让我的生活更轻松,不那么单调,让我对女性更具吸引力(最后一段是我编的):
https://docs.djangoproject.com/en/1.4/topics/generic-views/
我完全是为了改善我的生活,但通用视图实际上有什么作用?似乎有很多流行语被抛出,这比他们解释的更令人困惑。
通用视图是否类似于 Ruby on Rails 中的脚手架?介绍中的最后一个要点似乎表明了这一点。这是一个准确的说法吗?
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))
仅此:
# urls.py
url('^some-url/$', direct_to_template, {'template': 'template_name.html'})
# views.py doesn't need any code for this view anymore
还有更复杂的通用视图用于常见操作,例如“显示模型列表”或“将模型添加到数据库”。
此外,因为通用视图只是函数,所以当您需要与通用案例有点不同的东西时,您可以在自己的视图函数中调用它们来完成“大部分工作”。
通用视图允许您编写更短的代码。
比较:
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
回答您的第二个问题:不,通用视图与 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')
现在请求上下文将被传递!这只是一个开始。例如,当您想要显示列表或详细视图时,通用视图会派上用场。他们将管理查询数据库、向用户发送消息等。
因此,通用视图是高级功能,可帮助您从视图创建响应。