Django熟悉工程库和app之间的联系

在之前我们介绍了如何建立虚拟环境以及创建django环境
那么创建的工程中那些文件具体代表什么呢,分别怎么用的呢

在工程项目中:

分为init,setttings,urls,wsgi四大类
这里写图片描述

init

表示的是初始话给的环境一般用到的就是数据库

import pymysql
pymysql.install._as_MYSQLdb()

setting

在这里面都是修改的一些参数常用的就是

添加自己创建的app名字

INSTALLED_APPS中

创建数据库连接

DATABASES 中修改参数上篇我们教过

返回设计页面

在TEMPLATES中添加DIRS里的[os.path.join(BASE_DIR,’创建html的文件夹名字’)]
同时要注释MIDDLEWARE里的csrf参数

传入图片参数

在最下面添加参数
STATICFILES = [
os.path.join(BASE_DIR,’static’)
]

urls

表示用户输入的地址对应显示的样式通常需要绑定设定的app里面的urls使用

include(‘app.urls’)
需要说明的是创建的app中没有urls需要自己创建一个然后往里面写入urls

如果想返回404 500等界面需要修改settings:
DEBUG = False

ALLOWED_HOSTS = [‘*’]
工程目录urls:

from app的名字.views import page_not_found,server_error(函数名)
handler404 = page_not_found
handler500 = server_error
#以下内容在app的viwes中写入 因此上面要导入views
def page_not_found(request):
    return render(request, '404.html')#自己设置的页面 名字也是自己设定的 


def server_error(request):
    return render(request, '500.html')#自己设置的页面

app项目中

这里写图片描述

admin

配置超级管理员
创建管理超级管理员帐号和密码

cmd模式下
python manage.py createsuperuser

在文件中创建如何添加 数据库的方式

from django.contrib import admin

# Register your models here.
from stu.models import Student


# 第二种注册方式
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
    def set_sex(self):
        if self.sex:
            return self.sex
        else:
            return '女'

    # 修改性别描述
    set_sex.short_description = '性别'
    list_display = ['id', 'name', set_sex]
    # 过滤
    list_filter = ['name']
    # 搜索
    search_fields = ['name']
    # 分页
    list_per_page = 2  # 一页只能放两条数据

# 1.注册的第一种方式:
# admin.site.register(Student, StudentAdmin)

models 创建数据库

就是创建数据库中的表格用法和mysql不太一样但是原理是一样的因为ORM简化了步骤

模型字段models.py中:
CharField():字符串
BooleanField():布尔类型返回的是0,1

DataField:年月日,存放日期其中auto_now = True每次修改都记录时间auto_now_add = True表示只有第一次创建的时候才会设置时间
DateTimeField:年月日时分秒

下拉列表AutoField:自动增长

DecimalField():decimal_places =小数后多少位/ max_digits =总位数例如
decimal_places = 1,max_digits = 3表示总为数3位小数1位类似似99.9

TestField:存储很长的信息

IntegerField:存整数
FloatField:存小数

FileField字段:文件上传
ImageField():上传图片upload_to =''指定上传图片的路径

模型字段中的参数
默认=默认字段
null:设置是否为空,针对数据库字段
blank:设置是否为空,针对表单提交字段----一般两个一起写
独特=真表示唯一,不能有一样的数据
主键= True设置主键

其中最主要的部分为引入外键同时有以下概念:
引入的键有一对一,一对多,多对多:
1.一对一表示一个参数只能对应一个键,不能有重复的:例如一个QQ群只有一个群主,人和群主就是一对一的关系
这里写图片描述
2.一对多表示一个键可以被多次运用,可以重复:例如学生对应的班级 某某学生是一班、某某是二班、某某是一班
这里写图片描述
3.多对多表示键可以多个匹配参数,参数也可以多次用键值:例如商品可以被多个人选中,人也可以选择多个商品
这里写图片描述
因此在设置modles时候参数分别有:
一对一

models.OneToOneField(对应的表格)

一对多

models.ForeignKey(表格名字)

多对多

models.ManyToManyField(表格名字)
然后在在数据库中去匹配对应的关系

下列是例子创建

from django.db import models


class Student(models.Model):
    stu_name = models.CharField(max_length=6)
    stu_sex = models.BooleanField()
    stu_birth = models.DateField()
    stu_chrete_time = models.DateField(auto_now_add=True)
    stu_operate_time = models.DateField(auto_now=True)
    stu_tel = models.CharField(max_length=11)
    stu_delete = models.BooleanField(default=0)
    yuwen = models.DecimalField(max_digits=3,default=0,decimal_places=2)
    shuxue = models.DecimalField(max_digits=3,default=0,decimal_places=2)

    class Meta:# 这里表示创建的表格的名字
        db_table = 'stu'

views 返回函数以及返回的视角

下面的实例表示提交到数据库写法的

from django.db.models import F, Q
from django.http import HttpResponse
from django.shortcuts import render
from stu.models import Student


def hello(request):
    #添加学生信息
    if request.method == 'GET':
        return render(request,'index.html')
    # 处理提交的信息
    if request.method == 'POST':
        stu_name = request.POST.get('name')
        # if request.POST.get('sex') == '男':
        #     stu_sex = 1
        # else:
        #     stu_sex = 0
        stu_sex = request.POST.get('sex')
        stu_birth = request.POST.get('birth')
        stu_tel = request.POST.get('tel')
        # 方法一:
        # stu = Student()
        # stu.stu_name = stu_name
        # stu.stu_birth = stu_birth
        # stu.stu_sex = stu_sex
        # stu.stu_tel = stu_tel
        # stu.save()
        # 方法二:
        Student.objects.create(
            stu_name=stu_name,
            stu_sex=stu_sex,
            stu_tel=stu_tel,
            stu_birth=stu_birth
        )

        return HttpResponse('添加成功')

查询的基本表示方式首先

modles里设置的表格class的名字.objects.参数

get():返回一个满足条件的对象。如果没有返回符合条件的对象,会应该模型类DoesNotExist异常,如果找到多个,会引发模型类MultiObjectsReturned异常
这里说的一个表示后面在写对应的html就需不需要用for循环
first():返回查询集中的第一个对象,迭代[0]或者first()表示切片返回一个

last():返回查询集中的最后一个对象

count():返回当前查询集中的对象个数

exists():判断查询集中是否有数据,如果有数据返回True,没有返回False
order_by(‘-id’) 排序
__startswith 以什么开始
__endswith 以什么结尾
__contains 包涵
__ge 大于
__gte 大于等于
__lt 小于
__lte 小于等于

查询表格时候如果设置的表里是写的外键可以直接.键名字

s = StudentInfo.objects.filter(stu_addr__contains=’大悦城’)[0]
st = s.stu # sut表示models中的 返回的是单独数组不能用for循环看

通过学生表去查找拓展表信息(用小写_set 表示两个表连接起来 类似join)

    # 查找姓名为xx的信息
    stu = Student.objects.filter(stu_name='孙权').first()
    st = StudentInfo.objects.filter(stu_id=stu.id)
    # 方法二
    # stu = Student.objects.filter(stu_name='孙权').first()
    # 注意:studentinfo 小写
    # st = stu.studentinfo_set.all()
    # st = stu.stu_info #如果有related_name只能用这个方法
def selectStu(request):
    #查询数据
    s = Student.objects.all()
    #查询某一项的数据 filter
    stus = Student.objects.filter(stu_sex=0)
    # 查询顺序
    ss = Student.objects.all().order_by('-id')
    #查询id最大的值
    ssu = Student.objects.all().order_by('-id').first()
    print(ssu)
    # 获取个数
    ss = Student.objects.all().filter(stu_sex=1).count()
    # 查询80后所有女生(查询多个数据)
    ss = Student.objects.all().filter(stu_sex=0,stu_birth__gte='1980-01-01',stu_birth__lt='1990-01-01')
    #查询姓c的(查询以什么开头)/(以什么结尾)——like %
    ss = Student.objects.filter(stu_name__startswith='c',stu_name__endswith='d')
    #查询名字包涵(查询数据中有的数据)
    ss = Student.objects.filter(stu_name__contains='c')
    #判断是否存在 ——返回布尔值
    ss = Student.objects.filter(stu_name='cc').exists()
    print(ss)
    #获取制定多个值
    ids = [1,4]
    ss = Student.objects.filter(id__in=ids)
    # 查询yuwen大于shuxue超多10分的
    s = Student.objects.filter(yuwen__gte=F('shuxue') + 10)
    # 查询不叫cc名字,或者yuwen大于80的
    s = Student.objects.filter(~Q(stu_name='cc') | Q(yuwen__gt=80))

    #返回给前端(返回的是页面)
    return render(request,'sel_stu.html',{'st':s})

其中请求函数
post 提交数据
get 提交数据在url上
put 更新全部数据
patch 更新局部数据
delete 删除
例如

ss = Student.objects.filter(id__in=ids).delete()

建立返回的网页
return render()

如果是需要传参那么也需要加reverse
return render(reverse,‘xxx.html’,{‘xx’:xx})

HttpRsponse表示返回的字符

return HttpResponse(‘heihei’)

返回重定向页面
HttpResponseRedirect

这里写图片描述
在views中使用return HttpResponseRedirect方式跳转页面,也就是执行完后可以跳转回之前或者别的页面
如果是传参或者是写参数名需要写reverse,如果只是传入地址不需要写reverse

return HttpResponseRedirect(
reverse(‘namespace:name’, kwargs={‘c(参数名)’: a(值——变量名)})
)
return HttpResponseRedirect(‘/uau/lo/(url地址)’)

这里需要说明的是传入的参数名是下面urls中需要用到的

建立urls.py

自己新建urls文件

格式

url(r’^域名/’, views.方法)

特殊说明
通过html传递参数除了可以用get来获取 还可以直接通过正则函数来传递
获取数据
将需要的参数传入(\d+)中 然后就def中提取出来使用

url(r’^stu/(\d+)/’, views.show)

通过给工程和app的url取别名可以在jajin2或者views中使用
namespace和name

url(r’^cla/’,include(‘sst.urls’,namespace=’s’))
url(r’^stu/(\d+)/’, views.show,name=’add’)

{% url ‘namespace(工程urls里别名设置):name(app的urls别名设置)’ 提供的需要的参数 %}

<a href="{% url 's:add' c.id %}">

urls中指定参数
?P<参数名>\d+

url(r'^tiao/(?P<c(参数名)>\d+)/', views.redirectStu,name='tt'),

自己写的HTML中

如果是给用户填写数据然后保存到数据库中
需要用到form actioin=’/之前设置路径(urls)/ method=“post”

<form action="/s/addstu/" method="post">
    姓名:<input type="text" name="name">
    性别:<input type="text" name="sex">
    生日:<input type="date" name="birth">
    语文:<input type="text" name="yuwen">
    数学:<input type="text" name="shuxue">
    <input type="submit" value="提交">
</form>

Jinjia2后面我们做详细的说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值