Django-View视图

简介: Django-View视图

View视图工作原理


Django的Web开发遵循了MVC的模式,Modle, View,Controller。 在Django中的体现是MVT,Model,View,Template。


View (视图) 主要根据用户的请求返回数据,用来展示用户可以看到的内容(比如网页,图片),也可以用来处理用户提交的数据,比如保存到数据库中。Django的视图(View)通常和URL路由一起工作的。服务器在收到用户通过浏览器发来的请求后,会根据urls.py里的关系条目,去视图View里查找到与请求对应的处理方法,从而返回给客户端http页面数据。


返回简单字符串文本

# views.py
from django.http import HttpResponse
def index(request):
    return HttpResponse("Hello, World!")

简单返回需要渲染的模板

# blog/urls.py
from django.urls import path
from . import views
urlpatterns = [
    path('blog/', views.index, name='index'),
   path('blog/article/<int:id>/', views.article_detail, name='article_detail'),
]
# blog/views.py
from django.shortcuts import render, get_object_or_404
from .models import Article
# 展示所有文章
def index(request):
    latest_articles = Article.objects.all().order_by('-pub_date')
    return render(request, 'blog/article_list.html', {"latest_articles": latest_articles})
# 展示所有文章
def article_detail(request, id):
    article = get_object_or_404(Article, pk=id)
    return render(request, 'blog/article_detail.html', {"article": article})
  • 当输入的URL为/blog/的时候,django会调用views.py中的index方法。

  • 当输入的URL为/blog/article/int:id的时候, url会调用views.py中的article_detail()方法。还会吧参数文章id当作变量传递到视图中

Render(),来自Django.contrib import shortcut


render方法有4个参数。第一个是request,第二个是模板的名称和位置,第三个是传递给模板的内容,也称为context object。第四个参数是可选参数content_type(内容类型)


get_object_or_404方法第一个参数 是模型Models或数据集queryset的名字,第二个参数是需要满足的条件比如pk = id, title = ‘python’)。当需要获取的对象不存在时,给方法会自动返回Http 404错误。


表单form Post方法处理

from django.shortcuts import render, get_object_or_404
from django.contrib.auth.models import User
from .forms import ProfileForm
from django.http import HttpResponseRedirect
from django.urls import reverse
def profile_update(request, pk):
    user = get_object_or_404(User, pk=pk)
    if request.method == "POST":
        form = ProfileForm(request.POST)
        if form.is_valid():
            user.first_name = form.cleaned_data['first_name']
            user.last_name = form.cleaned_data['last_name']
            user.save()
            return HttpResponseRedirect(reverse('users:profile', args=[user.id]))
    else:
        default_data = {'first_name': user.first_name, 'last_name': user.last_name,
                    }
        form = ProfileForm(default_data)
    return render(request, 'users/profile_update.html', {'form': form, 'user': user})
# users/forms.py
from django import forms
class ProfileForm(forms.Form):
    first_name = forms.CharField(label='First Name', max_length=50, required=False)
    last_name = forms.CharField(label='Last Name', max_length=50, required=False)

我们先从url获取user的主键pk(id), 利用get_object_or_404方法获取需要修改个人资料的用户对象user。


当用户通过POST方法提交个人资料修改表单,我们利用is_valid()方法先验证表单ProfileForm的数据是否有效。如果有效,我们将更新过的first_name和last_name数据存入user对象。更新成功返回个人信息页。


如果用户没有提交表单或不是通过POST方法提交表单,我们先获取现有数据生成default_data,利用ProfileForm显示。


ProfileForm实际上是非常简单的,包含了我们允许用户修改的字段。在这个案例里,我们没允许用户修改用户名和电子邮件,所以没有加进去。


基于函数的视图(Function Based View)和基于类的视图(Class Based View)


Django中大的视图有两种, Class Based View 和 Function Base View。在实际开发过程中,很多功能具有相同点,可以进行功能的合并进行封装。


展示对象列表(比如所有用户,所有文章)- ListView


展示某个对象的详细信息(比如用户资料,比如文章详情) - DetailView


通过表单创建某个对象(比如创建用户,新建文章)- CreateView


通过表单更新某个对象信息(比如修改密码,修改文字内容)- UpdateView


用户填写表单后转到某个完成页面 - FormView


删除某个对象 - DeleteView


Django中的ListView


ListView用来展示一个对象的列表。它只需要一个参数模型名称即可。比如我们希望展示所有文章列表,我们的views.py可以简化为:

# Create your views here.
from django.views.generic import ListView
from .models import Article
class IndexView(ListView):
    model = Article
# 上述代码等同于
# 展示所有文章
def index(request):
    queryset = Article.objects.all()
    return render(request, 'blog/article_list.html', {"object_list": queryset})

对于返回数据的更加详细的指定

# Create your views here.
from django.views.generic import ListView
from .models import Article
from django.utils import timezone
class IndexView(ListView):
    template_name = 'blog/article_list.html'
    context_object_name = 'latest_articles'
    def get_queryset(self):
        return Article.objects.filter(author=self.request.user).order_by('-pub_date')
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['now'] = timezone.now()
        return context

Django中的DetailView


DetailView用来展示一个具体对象的详细信息。它需要URL提供访问某个对象的具体参数(如pk, slug值)。本例中用来展示某篇文章详细内容的view可以简写为:

# Create your views here.
from django.views.generic import DetailView
from django.http import Http404
from .models import Article
from django.utils import timezone
class ArticleDetailView(DetailView):
    queryset = Article.objects.all().order_by("-pub_date")
    template_name = 'blog/article_detail.html'
    context_object_name = 'article'
    def get_object(self, queryset=None):
        obj = super().get_object(queryset=queryset)
        if obj.author != self.request.user:
            raise Http404()
        return obj
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['now'] = timezone.now()
        return context


相关文章
|
6月前
|
Python
Django——视图
Django——视图
|
4月前
|
JSON 前端开发 API
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
70 2
|
4月前
|
JSON 数据处理 API
Django后端架构开发:视图与模板的正确使用
Django后端架构开发:视图与模板的正确使用
43 1
|
3月前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
4月前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
82 0
|
4月前
|
安全 API Python
Django 如何使用视图动态输出 CSV 以及 PDF
Django 如何使用视图动态输出 CSV 以及 PDF
52 4
|
4月前
|
Linux Shell 数据库
python Django教程 之 安装、基本命令、视图与网站
python Django教程 之 安装、基本命令、视图与网站
|
5月前
|
API 数据库 数据安全/隐私保护
Django配置api、管理系统和视图
Django配置api、管理系统和视图
129 1
|
4月前
|
测试技术 Shell 数据库
Django视图测试:构建可靠Web应用的关键步骤
Django视图测试:构建可靠Web应用的关键步骤
31 0
|
6月前
|
安全 API Python
Django 如何使用视图动态输出 CSV 以及 PDF
这一篇我们需要用到 python 的 csv 和 reportLab 库,通过django视图来定义输出我们需要的 csv 或者 pdf 文件。