Django与vue

衡高寒
2023-12-01

1、视图请求

常见的请求

request对象的类型是django.http.HttpRequest,常用属性如表所示:

方法说明
request.GET获取get请求数据的方法
request.POST获取post请求数据的方法
request.FILES获取文件上传请求数据的方法
request.method获取请求的方法
request.META请求的详细参数
request.META.OS请求端系统
request.META.HTTP_USER_AGENT用户请求头,返回请求浏览器版本
request.META.HTTP_HOST请求的主机
request.META.HTTP_REFERER请求的来源
GET请求处理

1、创建django项目

file----> new Project

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUcKv697-1622682613559)(images/image-20210531094731138.png)]

django-admin startproject projectname

4、创建app

python manage.py startapp app01

5、 在settings.py下配置app

# django 注册app的变量位置
INSTALLED_APPS = [

    # 自建app
    'app01.apps.App01Config',
]

6、 在主路由下配置子路由分发

from django.urls import path, include

urlpatterns = [
    path('app01/', include('app01.urls')),
]

7、 在app01下新建urls.py文件,写入以下内容

from django.urls import path
from . import views
urlpatterns = [

]

8、在app01文件夹下的models.py中写一个学生的模型类,有姓名、性别、家庭住址等字段。

class Student(models.Model):
    name = models.CharField(max_length=32)
    sex = models.CharField(max_length=10)
    address = models.CharField(max_length=200)
    
    def __str__(self):
        return self.name

9、 生成迁移文件和执行迁移文件

python manage.py makemigrations

python manage.py migrate

10、 在admin中注册学生表

# 导入学生模型
from .models import Student

admin.site.register(Student)

11、 创建超级用户

python manage.py createsuperuser

12、 使用admin后台账号,登录 admin后台,添加几个学生信息

13、新建show_student.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>

14、 在views.py中写一个函数,返回所有的学生信息

from django.shortcuts import render
from .models import Student
# Create your views here.


def show_student(request):
    # 查询 所有的学生信息
    # 使用all() 方法
    stu_list = Student.objects.all()
    # 把查询 出来的内容返回到页面中
    # render(request, '模版地址', '返回时要带的参数')
    return render(request, 'show_student.html', {'stu_list': stu_list})

15、 写路由,在app01下的urls.py中添加路由

from django.urls import path
from . import views
urlpatterns = [
    path('show_student/', views.show_student)
]

16、 在页面中使用表格展示所有的学生信息

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table>
        <tr>
            <td>姓名</td>
            <td>性别</td>
            <td>地址</td>
        </tr>

        {#   使用for循环展示学生信息     #}
        {% for stu in stu_list %}
            <tr>
                {#     {{  }}       #}
                <td>{{stu.name}}</td>
                <td>{{stu.sex}}</td>
                <td>{{stu.address}}</td>
            </tr>
        {% endfor %}

    </table>
</body>
</html>
POST请求处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zefat8Z3-1622682613561)(images/image-20210530222018328.png)]

向指定的资源提交要被处理的数据;使用POST,提交的数据保存在HTTP协议中的消息主体部分

  • post请求不会被浏览器缓存
  • post提交数据长度无限制
  • postget更加安全

获取用户以post形式提交的数据并保存在后台,为类字典数据,这里和request.GET是一个东西;

在网页中,一般我们通过html的表单进行数据的提交,POST方式可以提交空数据

1、 新建添加学生页面

在项目下的templates文件夹中新建add_student.html, 写入form表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <form action="">
            <p>姓名: <input type="text"></p>
            <p>性别:
                <select name="" id="">
                    <option value=""></option>
                </select>
            </p>
            <p>地址: <input type="text"></p>
            <input type="submit" value="添加">
        </form>
    </div>
</body>
</html>

2、 使用get方法返回添加页面

def add_student(request):
    if request.method == 'GET':
        return render(request, 'add_student.html')

3、 添加路由

from django.urls import path
from . import views
urlpatterns = [
    path('add_student/', views.add_student),  # 添加学生
]

4、 访问添加学生地址,返回以下页面

http://127.0.0.1:8000/app01/add_student/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJw60bIt-1622682613562)(images/image-20210530224512660.png)]

5、添加学生视图中使用post获取数据,并添加到数据库中

def add_student(request):
    if request.method == 'GET':
        return render(request, 'add_student.html')
    elif request.method == 'POST':
        # 获取网页提交的内容
        print(request.POST)
        """
        <QueryDict: {'csrfmiddlewaretoken': ['me9jfBJUYKXUPI6sT21UTH86sLbBBhq4vDdr3yXYkZ1Zurj8Ptdz6XIMascbg3RI'], 
        'name': ['董老师'], 'sex': ['男'], 'address': ['四川']}>
        dict.get('key')
        """
        name = request.POST.get('name')
        sex = request.POST.get('sex')
        address = request.POST.get('address')
        print(name, sex, address)
        # 添加
        Student.objects.create(name=name, sex=sex, address=address)
        return render(request, 'add_student.html')

6、 在html页面中实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <form action="" method="post">
            {% csrf_token %}
            <p>姓名: <input type="text" name="name"></p>
            <p>性别:
                <select name="sex" id="">
                    <option value="男">男</option>
                    <option value="女">女</option>
                </select>
            </p>
            <p>地址: <input type="text" name="address"></p>
            <input type="submit" value="添加">
        </form>
    </div>
</body>
</html>

input输入的内容,需要使用input当中的name属性来获取。

2、 视图响应

视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

访问django路由时,响应的

1、 HttpResponse

可以使用django.http.HttpResponse来构造响应对象。

HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)

也可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码:

  • content:表示返回的内容。
  • status_code:返回的HTTP响应状态码。
  • content_type:指定返回数据的的MIME类型。
def show_student1(request):
    # 查询 所有的学生信息
    # 使用all() 方法
    stu_list = Student.objects.all()
    print(stu_list)
    # 把查询 出来的内容返回到页面中
    # render(request, '模版地址', '返回时要带的参数')
    # return render(request, 'show_student.html', {'stu_list': stu_list})
    stu_data = [{'id': i.pk, 'name': i.name, 'sex': i.sex, 'address': i.address} for i in stu_list]
    return HttpResponse(json.dumps(stu_data, ensure_ascii=False))
JsonResponse
def show_student2(request):
    # 查询 所有的学生信息
    # 使用all() 方法
    stu_list = Student.objects.all()
    print(stu_list)
    # 把查询 出来的内容返回到页面中
    # render(request, '模版地址', '返回时要带的参数')
    # return render(request, 'show_student.html', {'stu_list': stu_list})
    stu_data = [{'id': i.pk, 'name': i.name, 'sex': i.sex, 'address': i.address} for i in stu_list]
    return JsonResponse(stu_data, safe=False, json_dumps_params={'ensure_ascii': False})

HttpResponseRedirect

重定向

1、在models.py 下新建用户模型

class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=128)

    def __str__(self):
        return self.username

2、 在admin.py中进行注册,用admin后台管理添加用户

# 导入用户模型
from .models import User

admin.site.register(User)

3、在admin后台,添加用户信息

4、 写个login.html页面,进行登录

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <form action="" method="post">
            {% csrf_token %}
            <p>username: <input type="text" name="username"></p>
            <p>password: <input type="password" name="password"></p>
            <input type="submit" value="登录">
        </form>
    </div>
</body>
</html>

5、写个views.py,处理登录逻辑

  • 使用get请求进行页面渲染

    # 如果请求方法为get,返回登录页面
    def login(request):
        if request.method == 'GET':
            return render(request, 'login.html')
    
  • 添加路由

    from django.urls import path
    from . import views
    app_name = 'app01'
    urlpatterns = [
        path('login/', views.login),  # 展示学生
    ]
    
  • 使用post方法获取数据,并进行重定向

    def login(request):
        if request.method == 'GET':
            return render(request, 'login.html')
    
        elif request.method == 'POST':
            # 获取post提交的数据
            print(request.POST)
    
            username = request.POST.get('username')
            password = request.POST.get('password')
    
            # 通过用户名,过滤user对象,获取他的第一条数据.first(),用来判断用户是否存在
            # filter当中:第一个username是User下面的字段,第二个username是post提交的数据变理
            user_obj = User.objects.filter(username=username).first()
    
            print('获取到的用户信息:', user_obj)
            # 如果用户存在,并且密码正确
            if user_obj and password == user_obj.password:
                # 用户存在,并且密码正确时,跳转页面到主页
                return redirect('app01:show_student')
            else:
                return render(request, 'login.html', {'msg': '登录失败'})
    

3、 类视图

需要继承View: from djago.views import View

导包规则:

最上面导django自带的包
中间空一行,导Python包
最下面空一行,导自已写的包

class LoginView(View):

    def get(self, request):
        return render(request, 'login.html')
    
    def post(self, request):
        # 获取post提交的数据
        print(request.POST)

        username = request.POST.get('username')
        password = request.POST.get('password')

        # 通过用户名,过滤user对象,获取他的第一条数据.first(),用来判断用户是否存在
        # filter当中:第一个username是User下面的字段,第二个username是post提交的数据变理
        user_obj = User.objects.filter(username=username).first()

        print('获取到的用户信息:', user_obj)
        # 如果用户存在,并且密码正确
        if user_obj and password == user_obj.password:
            # 用户存在,并且密码正确时,跳转页面到主页
            return redirect('app01:show_student')
        else:
            return render(request, 'login.html', {'msg': '登录失败'})

类视图路由写法

"""
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
"""

from django.urls import path
from . import views
app_name = 'app01'
urlpatterns = [
    path('login1/', views.LoginView.as_view()),  # 用户登录
]
 类似资料: