Day_19-Django(二)
admin
2023-05-29 11:21:28
0次

本节内容概要:

一、路由系统URL

二、视图

三、模板

四、ORM操作

问题1:Django请求生命周期

-> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串
-> URL对应关系(匹配) -> 视图函数 -> 打开一个HTML文件,读取内容

问题2:创建Django project

django-admin  startproject xxx

cd xxx

python manage.py startapp CMDB


创建项目的所有步骤

1. 创建Django工程
            django-admin startproject 工程名

    2. 创建APP
        cd 工程名
        python manage.py startapp cmdb

    3、静态文件
        project.settings.py
        
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, "static"),
        )
    
    4、模板路径
    
        DIRS ==>    [os.path.join(BASE_DIR,'templates'),]
        
    5、settings中
        
        middlerware        
            # 注释 csrf
            
            
    6、定义路由规则
        url.py        
            "login" --> 函数名
            
    7、定义视图函数
app下views.py

def func(request):                # request.method   GET / POST
                
                # http://127.0.0.1:8009/home?nid=123&name=alex
                # request.GET.get('',None)   # 获取请求发来的而数据
                
                # request.POST.get('',None)
                
                
                # return HttpResponse("字符串")
                # return render(request, "HTML模板的路径")
                # return redirect('/只能填URL')
8、模板渲染
特殊的模板语言
-- {{ 变量名 }}

    def func(request):
        return render(request, "index.html", {'current_user': "alex"})

        
    index.html
    
    
    ..
        
            
`current_user`
                            ====> 最后生成的字符串               ..                      
alex
                   -- For循环     def func(request):         return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']})              index.html               ..                      
`current_user`
                         
                    {% for row in user_list %}                                      {% if row == "alex" %}                         
  • {{ row }}
  •                     {% endif %}                                      {% endfor %}             
                                     #####索引#################      def func(request):         return render(request, "index.html", {                     'current_user': "alex",                      'user_list': ['alex','eric'],                      'user_dict': {'k1': 'v1', 'k2': 'v2'}})              index.html               ..                      
`current_user`
                          {{ user_list.1 }}               {{ user_dict.k1 }}               {{ user_dict.k2 }}                                  ###### 条件     def func(request):         return render(request, "index.html", {                     'current_user': "alex",                      "age": 18,                     'user_list': ['alex','eric'],                      'user_dict': {'k1': 'v1', 'k2': 'v2'}})              index.html               ..                      
`current_user`
                          {{ user_list.1 }}               {{ user_dict.k1 }}               {{ user_dict.k2 }}                           {% if age %}                 有年龄                 {% if age > 16 %}                     老男人                 {% else %}                     小鲜肉                 {% endif %}             {% else %}                 无年龄             {% endif %}                   


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

一、路由系统URL

1.三种方式

1、url(r'^index/', views.index),    
     url(r'^home/', views.Home.as_view()),
2、url(r'^detail-(\d+).html', views.detail),  
3、url(r'^detail-(?P\d+)-(?P\d+).html', views.detail)

 ps:

def detail(request, *args,**kwargs):
pass

实战:

1.url(r'^detail-(\d+)-(\d+).html', views.detail),

def func(request, nid, uid):                    
         pass
            
         def func(request, *args):
             args = (2,9)                    
         def func(request, *args, **kwargs):
             args = (2,9)

2.url(r'^detail-(?P\d+)-(?P\d+).html', views.detail)

def func(request, nid, uid):    pass
    def funct(request, **kwargs):
    kwargs = {'nid': 1, 'uid': 3}    
def func(request, *args, **kwargs):
    args = (2,9)


 name

     对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL *****

url(r'^asdfasdfasdf/', views.index, name='i1'),
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
url(r'^buy/(?P\d+)/(?P\d+)/', views.index, name='i3'),
def func(request, *args, **kwargs):    from django.urls import reverse
    
    url1 = reverse('i1')                              # asdfasdfasdf/
    url2 = reverse('i2', args=(1,2,))                 # yug/1/2/
    url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/

    
xxx.html
    
    {% url "i1" %}               # asdfasdfasdf/
    {% url "i2" 1 2 %}           # yug/1/2/
    {% url "i3" pid=1 nid=9 %}   # buy/1/9/

注:
# 当前的URL
request.path_info


多级路由

project/urls.py
    from django.conf.urls import url,include
    from django.contrib import admin

    urlpatterns = [
        url(r'^cmdb/', include("app01.urls")),
        url(r'^monitor/', include("app02.urls")),
    ]
    
app01/urls.py
    from django.conf.urls import url,include
    from django.contrib import admin
    from app01 import views

    urlpatterns = [
        url(r'^login/', views.login),
    ]
    
app02/urls.py
    from django.conf.urls import url,include
    from django.contrib import admin
    from app02 import views

    urlpatterns = [
        url(r'^login/', views.login),
    ]


 默认值

 

命名空间

 a. project.urls.py

from django.conf.urls import url,include
 
urlpatterns = [
    url(r'^a/', include('app01.urls', namespace='author-polls')),
    url(r'^b/', include('app01.urls', namespace='publisher-polls')),
]

b. app01.urls.py

from django.conf.urls import url
from app01 import views
 
app_name = 'app01'urlpatterns = [
    url(r'^(?P\d+)/$', views.detail, name='detail')
]

c. app01.views.py

def detail(request, pk):
    print(request.resolver_match)
    return HttpResponse(pk)

以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

  • v = reverse('app01:detail', kwargs={'pk':11})

  • {% url 'app01:detail' pk=12 pp=99 %}

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

通过反射机制,为django开发一套动态的路由系统Demo: 点击下载

 

二、视图

1、获取用户请求数据

request.GET
request.POST
request.FILES

PS:
GET:获取数据
POST:提交数据
2、checkbox等多选的内容

request.POST.getlist()

3、上传文件
# 上传文件,form标签做特殊设置

obj = request.FILES.get('fafafa')
obj.name
f = open(obj.name, mode='wb')for item in obj.chunks():
f.write(item)
f.close()

4、FBV & CBV
  function base view

url.py
index -> 函数名

view.py
def 函数(request):
...

====》
/index/ -> 函数名
/index/ -> 类
====》
建议:两者都用

5、装饰器
欠


三、ORM

1.mysql和ORM对应示例

select * from tb where id > 1     # 对应关系models.tb.objects.filter(id__gt=1)
models.tb.objects.filter(id=1)
models.tb.objects.filter(id__lt=1)

1.根据类自动创建数据库表

创建类

a. 先写类

找到models.py:

from django.db import models

class UserInfo(models.Model):    # id列,自增,主键
    # 用户名列,字符串类型,指定长度
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)


 找到如下添加最后一行:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]

 执行命令

python manage.py makemigrations 
python manage.py migrate


现在已经创建了一个表:app01_userinfo

提示:如果你不是用的默认数据库那么你需要找到setting.py的DATABASE更改其内容

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}


 # 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替

Django默认使用MySQLdb模块链接MySQL
主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...