通用视图(Generic Views)
优质
小牛编辑
127浏览
2023-12-01
在某些情况下,正如我们之前看到的那样,写视图非常重要。 想象一下,您需要一个静态页面或列表页面。 Django提供了一种简单的方法来设置那些称为通用视图的简单视图。
与经典视图不同,通用视图是类而不是函数。 Django在django.views.generic中为泛型视图提供了一组类,每个泛型视图都是其中一个类或从其中一个继承的类。
有10多个通用类 -
>>> import django.views.generic
>>> dir(django.views.generic)
['ArchiveIndexView', 'CreateView', 'DateDetailView', 'DayArchiveView',
'DeleteView', 'DetailView', 'FormView', 'GenericViewError', 'ListView',
'MonthArchiveView', 'RedirectView', 'TemplateView', 'TodayArchiveView',
'UpdateView', 'View', 'WeekArchiveView', 'YearArchiveView', '__builtins__',
'__doc__', '__file__', '__name__', '__package__', '__path__', 'base', 'dates',
'detail', 'edit', 'list']
这可以用于您的通用视图。 让我们看一些例子,看看它是如何工作的。
静态页面
让我们从“static.html”模板发布一个静态页面。
我们的static.html -
<html>
<body>
This is a static page!!!
</body>
</html>
如果我们按照以前的方式做到这一点,我们必须将myapp/views.py更改为 -
from django.shortcuts import render
def static(request):
return render(request, 'static.html', {})
和myapp/urls.py是 -
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views", url(r'^static/', 'static', name = 'static'),)
最好的方法是使用通用视图。 为此,我们的myapp/views.py将成为 -
from django.views.generic import TemplateView
class StaticView(TemplateView):
template_name = "static.html"
我们的myapp/urls.py我们将 -
from myapp.views import StaticView
from django.conf.urls import patterns
urlpatterns = patterns("myapp.views", (r'^static/$', StaticView.as_view()),)
访问/ myapp/static时,你会得到 -
为了同样的结果,我们也可以,做以下 -
- views.py中没有变化
- 将url.py文件更改为 -
from django.views.generic import TemplateView
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views",
url(r'^static/',TemplateView.as_view(template_name = 'static.html')),)
如您所见,您只需要在第二种方法中更改url.py文件。
从DB列出和显示数据
我们将列出Dreamreal模型中的所有条目。 通过使用ListView通用视图类,可以轻松完成此操作。 编辑url.py文件并将其更新为 -
from django.views.generic import ListView
from django.conf.urls import patterns, url
urlpatterns = patterns(
"myapp.views", url(r'^dreamreals/', ListView.as_view(model = Dreamreal,
template_name = "dreamreal_list.html")),
)
此时需要注意的重要一点是,通用视图传递给模板的变量是object_list。 如果要自己命名,则需要在as_view方法中添加context_object_name参数。 然后url.py将成为 -
from django.views.generic import ListView
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views",
url(r'^dreamreals/', ListView.as_view(
template_name = "dreamreal_list.html")),
model = Dreamreal, context_object_name = ”dreamreals_objects” ,)
相关的模板将是 -
{% extends "main_template.html" %}
{% block content %}
Dreamreals:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %}
访问/ myapp/dreamreals /将生成以下页面 -