zoukankan      html  css  js  c++  java
  • Django 学习第三式

    1、Django请求生命周期
    两种情况:最终返回的是字符串
    1、-> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串
    2、-> URL对应关系(匹配) -> 视图函数 -> 打开一个HTML文件,读取内容

    2、创建django projcet

    django-admin startproject mysite

    mysite
    mysite
    - 配置文件
    - url.py
    - settings.py

    cd mysite
    python manage.py startapp cmdb

    mysite
    mysite
    - 配置文件
    - url.py
    - settings.py
    cmdb
    - views.py
    - admin.py
    - models.py # 创建数据库表

    3、配置

    模板路径
    静态文件路径
    # CSRF 注释掉

    4、编写程序

    a. url.py

    /index/ -> func

    b. views.py

    def func(request):
    # 包含所有的请求数据
    ...
    获取字符串: return HttpResponse('字符串')
    获取html: return render(request, 'index.html', {''})
    获取url: retrun redirect('URL')

    c. 模板语言
    return render(request, 'index.html', {'li': [11,22,33]})
    for循环获取数据
    {% for item in li %}
    <h1>{{item}}</h1>
    {% endfor %}

    *********** 索引用点 **********
    获取第一个数据
    <h2> {{item.0 }} </h2>

    一、路由系统,URL。py文件里面有数据
    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<nid>d+)-(?P<uid>d+).html', views.detail)

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

    实战:
    a.
    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)

    b.
    url(r'^detail-(?P<nid>d+)-(?P<uid>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)
    4、 name

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

    url(r'^asdfasdfasdf/', views.index, name='i1'),
    url(r'^yug/(d+)/(d+)/', views.index, name='i2'),
    url(r'^buy/(?P<pid>d+)/(?P<nid>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
    5、多级路由

    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),
    ]
    
    
     
     
    from django.conf.urls import url,include
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^login/', views.login),
        url(r'^index/', views.index),
        url(r'^user_info/', views.user_info),
        url(r'^userdetail-(?P<nid>d+)/', views.user_detail),
        url(r'^userdel-(?P<nid>d+)/', views.user_del),
        url(r'^useredit-(?P<nid>d+)/', views.user_edit),
        url(r'^orm/', views.orm),
    ]
    
    
    from django.shortcuts import render,HttpResponse,redirect
    
    def login(request):
        if request.method == "GET":
            return render(request, 'login.html')
        elif request.method == "POST":
            # 数据库中执行 select * from user where usernam='x' and password='x'
            u = request.POST.get('user')
            p = request.POST.get('pwd')
            # obj = models.UserInfo.objects.filter(username=u,password=p).first()
            # print(obj)# obj None,
            # count = models.UserInfo.objects.filter(username=u, password=p).count()
            obj = models.UserInfo.objects.filter(username=u, password=p).first()
            if obj:
                return redirect('/cmdb/index/')
            else:
                return render(request, 'login.html')
        else:
            # PUT,DELETE,HEAD,OPTION...
            return redirect('/index/')
    
    
    def index(request):
        return render(request, 'index.html')
    
    def user_info(request):
        if request.method == "GET":
            user_list = models.UserInfo.objects.all()
            # print(user_list.query)
            # QuerySet [obj,obj,]
            return render(request, 'user_info.html', {'user_list': user_list})
        elif request.method == 'POST':
            u = request.POST.get('user')
            p = request.POST.get('pwd')
            models.UserInfo.objects.create(username=u,password=p)
            return redirect('/cmdb/user_info/')
            # user_list = models.UserInfo.objects.all()
            # return render(request, 'user_info.html', {'user_list': user_list})
    
    def user_detail(request, nid):
        obj = models.UserInfo.objects.filter(id=nid).first()
        # 去单挑数据,如果不存在,直接报错
        # models.UserInfo.objects.get(id=nid)
        return render(request, 'user_detail.html', {'obj': obj})
    
    def user_del(request, nid):
        models.UserInfo.objects.filter(id=nid).delete()
        return redirect('/cmdb/user_info/')
    
    def user_edit(request, nid):
        if request.method == "GET":
            obj = models.UserInfo.objects.filter(id=nid).first()
            return render(request, 'user_edit.html',{'obj': obj})
        elif request.method == "POST":
            nid = request.POST.get('id')
            u = request.POST.get('username')
            p = request.POST.get('password')
            models.UserInfo.objects.filter(id=nid).update(username=u,password=p)
            return redirect('/cmdb/user_info/')
    from django.db import models
    
    # Create your models here.
    # app01_userinfo
    class UserInfo(models.Model):
        # id列,自增,主键
        # 用户名列,字符串类型,指定长度
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)

    django里面的增加 删除 修改,查询:

    from app01 import models
    def orm(request):
        # 创建
       #一般用他: # models.UserInfo.objects.create(username='root',password='123')
    
        # dic = {'username': 'eric', 'password': '666'}
        # models.UserInfo.objects.create(**dic)
    
        # obj = models.UserInfo(username='alex',password='123')
        # obj.save()
    
        #
        # result = models.UserInfo.objects.all()
        # result = models.UserInfo.objects.filter(username='root',password='123')
        #
        # result,QuerySet => Django => []
        # [obj(id,username,password),obj(id,username,password), obj(id,username,password)]
        # for row in result:
        #     print(row.id,row.username,row.password)
        # print(result)
    
        # 删除
        # models.UserInfo.objects.filter(username="alex").delete()
    
        # 更新
        # models.UserInfo.objects.filter(id=3).update(password="69")
    
        return HttpResponse('orm')

    django 1.8之后推出的migrations机制使django的数据模式管理更方便容易,现在简单谈谈他的机制和一些问题的解决方法:

    1、谈谈机制:migrations机制有两个指令,第一个是makemigrations,

    第二个是migrate,生成migrations代码的makemigrations指令是用models里面的model和当前的migrations代码里面的model做对比,

    如果有新的修改,就生成新的migrations代码,

    migrate指令是用migrations目录中代码文件和django数据库djaong_migrations表中的代码文件做对比,

    如果表中没有,那就对这些没有的文件按顺序及依赖关系做migrate apply,然后再把代码文件名加进migrations表中

    一些问题的解决方法:

    1、旧的项目如果升级到migrations机制:项目当前状态,应该是数据库和model定义一致,然后makemigtations,把生成的migrations initial文件全部加进django_migtrations表中,剩下的工作就和正常使用一样了。

    2、managed=Fasle表的测试处理,空库测试,这部分表也需要做进测试数据库,这部分表,可以先在False状态下makemigrations,然后migrate一次,这样那些migrations代码已经属于已执行状态,剩下的就是把model和migrations代码中的manged全部切为true,这样这些代码就可以在空库测试中可用,同时不会再向数据库同步,当然这些表加字段就需要你自己先makemigrations一次,然后手动merge新旧migratons脚本,当然最后最后这部分新的migrations代码需要删除掉。

    3、关于migrations Schema学习的问题,migrations代码实际叫Schema,这个代码也是Python代码,非常易读,稍微学一下,以后可以帮助你解决不少类似问题2这样的问题

    摘自:https://www.cnblogs.com/dhcn/p/7124693.html

  • 相关阅读:
    常见的线性结构
    Lambda表达式学习笔记
    Spring Security 入门 (二)
    Spring Security 入门(一)
    Eclipse 创建 Maven 项目
    初学 Spring MVC(基于 Spring in Action)
    蓝桥杯之入学考试
    Java 学习总结
    二叉搜索树和红黑树
    Detours 劫持
  • 原文地址:https://www.cnblogs.com/1314520xh/p/8988874.html
Copyright © 2011-2022 走看看