• day18 django基础


    一、django基础配置

    1、基本配置

      创建Django工程
        django-admin startproject projectname ,或者直接通过pycharm创建

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

      setting.py 设置  

        STATICFILES_DIRS = (
          os.path.join(BASE_DIR, "static"),    #如果不配置会出现js、css、图片等访问失败
        )  

        DIRS ==> [os.path.join(BASE_DIR,'templates'),]    #html模板路径

        middlerware  # 注释 csrf   #否则请求当前页面会出现CSRF错误

        INSTALLED_APPS = [
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          'appname',        # 如果不配置会出现not in INSTALLED_APPS错误
        ]            

        ATABASES = {        # 数据库配置
         'default': {
         'ENGINE': 'django.db.backends.mysql',  # 使用mysql的时候配置,默认使用sqlit3
         'NAME': 'django',              # 库名称
         'USER': 'glen',                # 用户名
         'PASSWORD': 'starcor',            # 密码
         'HOST': 'www.puity.com',           #主机
         'PORT': '3306',                  #端口
         }
        }

      在APP/model.py里面添加表
        class User(models.Model):
         name = models.CharField(max_length=32)
         email = models.CharField(max_length=64)
         password = models.CharField(max_length=64)
         type = models.IntegerField()

      在app/admin.py里面注册表,让admin可以进行管理
        from bms import models
        admin.site.register(models.User)

      python.exe manage.py makemigrations appname  # 初始化,生成initial.py
      python.exe manage.py migrate            # 开始创建表
      python.exe manage.py createsuperuser       #创建admin,可通过http://host:port/admin来管理数据库表

    2、路由与基本的交互逻辑

      1、在urls.py里面设置路由  

      urlpatterns = [
       url(r'^home_page/user_delete_(?P<uid>d+).html', views.user_delete, name="user_delete"),
       url(r'^home_page/user_edit_(?P<uid>d+).html', views.user_edit, name="user_edit"),
       url(r'^home_page/user_add.html', views.user_add, name="user_add"),
       url(r'^home_page/group_(?P<gid>d+).html', views.detail_group, name="detail_group"),
       url(r'^home_page/user_(?P<uid>d+).html', views.detail_user, name="detail_user"),
       url(r'^home_page/user_list.html', views.user_list, name="user_list"),
       url(r'^home_page/group_list.html', views.group_list, name="group_list"),
       url(r'^login/$', views.login, name="login"),
       url(r'^home_page/$', views.home_page, name="home_page"),
      ]
      最后的name参数可以直接通过{{ name }}的方式放到模版中,可以自动帮忙渲染,不需要手动修改。
      (?P<uid>d+)相当于是传递给后面函数的一个参数,名字叫uid,多个可以使用**kwargs,如果没有?P<uid>就相当于位置参数,多个可以使用*args

      2、在app/views.py里面写交互逻辑 

        def login(request):
         if request.method == "POST":
         username = request.POST.get('username')    # 获取post提交的表单数据
         password = request.POST.get('password')
         try:
         db_password = models.User.objects.get(name=username).password  # 通过数据库表查询密码
         if password == db_password:
         return render(request, 'index.html')    # 返回管理界面
         else:
         return render(request, 'login.html', {'pwdError': '密码错误'})  # 密码错误,返回登陆界面,后面的字典需要和login.html里面的模版语言配合使用
         except Exception as e:
         print(e)
         return render(request, 'login.html', {'nameError': '用户名错误'})
         return render(request, 'login.html')

      3、通过访问呢http://host:port/login/  或 http://host:port就能访问到管理页面

    3、特殊的模版语言

        {% for host in hosts %}  # 由于模版返回的是一个字典{‘hosts':hosts},value hosts是一个包含多个字典的列表
          <tr>
            <td><input type="checkbox" name="IDCheck" value="14458579642011" class="acb" /></td>
            <td>{{ host.hostname }}</td>
            <td>{{ host.ip }}</td>
            <td>{{ host.port }}</td>
            <td>{{ host.type }}</td>
            <td>{{ host.group }}</td>
            <td>{{ host.user }}</td>
            {% if host.status == 1 %}  # 还可以嵌套if  else
            <td>启用</td>
            {% else %}
            <td>停用</td>
            {% endif %}
            <td>
              <a href="house_edit?fyID=14458579642011" class="edit">编辑</a>
              <a href="javascript:del('14458579642011');">删除</a>
            </td>
          </tr>
        {% endfor %}

        # 业务请求处理做的页面渲染
        return render("request", "template.html", {"k1": "v1", "k2": [11, 22, 33], "k3": {"nid": 12, "name": "aaa"})

        # html页面模板语法
        {{ k1 }}
        {{ k2.0 }} # 取列表中的第一个值,通过.获取
        {{ k3.name }} # 取字典中对应key的值

        # for循环

        {% for k,v in k3.items %}

          {{ k }} - {{ v }}

        {% endfor %}
        {% for item in k2 %}
          {{ item }},
          {{ forloop.counter }}, # 索引,从1开始,类似于python中的enumerate,
          {{ forloop.counter0 }}, # 索引,从0开始,类似于python中的enumerate,
          {{ forloop.first }}, # 判断当前item是否是第一个元素,成立为True,不成立为False
          {{ forloop.last }}, # 判断当前item是否是最后一个元素,成立为True,不成立为False
          {{ forloop.revcounter }} # 倒序索引,与forloop.counter 相反
        {% endfor %}

        内置函数

        {{ k1|lower }} # 将所有字母都变为小写
        {{ k1|first|upper }} # 将首字母变为大写
        {{ k1|truncatewords:"30" }} # 取变量k1的前30个字符
        {{ item.createTime|date:"Y-m-d H:i:s" }} # 将时间转为对应格式显示

    4、用户数据

      获取用户请求中的数据:
        request.POST.get()  #如果参数只有一个值直接使用get获取
        request.GET.get()
        reqeust.FILES.get()  

        # checkbox,     # 如果是复选框则需要使用getlist
        ........getlist()

        request.path_info    # 获取用户的uri


        文件对象 = reqeust.FILES.get()  
        文件对象.name
        文件对象.size
        文件对象.chunks()

        # <form 特殊的设置></form>


       给用户返回数据:
        render(request, "模板的文件的路径", {'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})
        redirect("URL")    # 重定向
        HttpResponse(字符串)  # 直接返回字符串,一般使用返回json

    5、ORM

      增
        models.User.objects.create(name='qianxiaohu',age=18)
        dic = {'name': 'xx', 'age': 19}
        models.User.objects.create(**dic)
        obj = models.User(name='qianxiaohu',age=18)
        obj.save()
      删
        models.User.objects.filter(id=1).delete()
      改
        models.User.objects.filter(id__gt=1).update(name='alex',age=84)  # id__gt=1    id大于1
        dic = {'name': 'xx', 'age': 19}
        models.User.objects.filter(id__gt=1).update(**dic)
      查
        models.User.objects.filter(id=1,name='root')
        models.User.objects.filter(id__gt=1,name='root')
        models.User.objects.filter(id__lt=1)    # id小与1
        models.User.objects.filter(id__gte=1)   # id大于等于1
        models.User.objects.filter(id__lte=1)   # id小与等于1

        models.User.objects.filter(id=1,name='root')
        dic = {'name': 'xx', 'age__gt': 19}
        models.User.objects.filter(**dic)

        v1 = models.Business.objects.all()
        # QuerySet ,内部元素都是对象

        # QuerySet ,内部元素都是字典
        v2 = models.Business.objects.all().values('id','caption')
        # QuerySet ,内部元素都是元组
        v3 = models.Business.objects.all().values_list('id','caption')

        # 获取到的一个对象,如果不存在就报错
        models.Business.objects.get(id=1)
        对象或者None = models.Business.objects.filter(id=1).first()


      外键:
        v = models.Host.objects.filter(nid__gt=0)
        v[0].b.caption ----> 通过.进行跨表

      外键:
        class UserType(models.Model):
          caption = models.CharField(max_length=32)

        class User(models.Model):
          age = models.IntergerFiled()
          name = models.CharField(max_length=10)
          user_type = models.ForeignKey("UserType",to_field='id') # 约束,

      多对多

      方式一:自定义关系表
        class Host(models.Model):
          nid = models.AutoField(primary_key=True)
          hostname = models.CharField(max_length=32,db_index=True)
          ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
          port = models.IntegerField()
          b = models.ForeignKey(to="Business", to_field='id')
       
        class Application(models.Model):
          name = models.CharField(max_length=32)
        
        class HostToApp(models.Model):
          hobj = models.ForeignKey(to='Host',to_field='nid')
          aobj = models.ForeignKey(to='Application',to_field='id')

      方式二:自动创建关系表
        class Host(models.Model):
          nid = models.AutoField(primary_key=True)
          hostname = models.CharField(max_length=32,db_index=True)
          ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
          port = models.IntegerField()
          b = models.ForeignKey(to="Business", to_field='id')

        class Application(models.Model):
          name = models.CharField(max_length=32)
          r = models.ManyToManyField("Host")

        无法直接对第三张表进行操作

        obj = Application.objects.get(id=1)
        obj.name

        # 第三张表操作
        obj.r.add(1)
        obj.r.add(2)
        obj.r.add(2,3,4)
        obj.r.add(*[1,2,3,4])

        obj.r.remove(1)
        obj.r.remove(2,4)
        obj.r.remove(*[1,2,3])

        obj.r.clear()  # 清空id=1应用对用的记录

        obj.r.set([3,5,7])
        
        # 所有相关的主机对象“列表” QuerySet
        obj.r.all()


  • 相关阅读:
    python代码工具化
    爬虫姓名测试打分2
    windows远程桌面设置
    scorecard用法
    C#本地应用向钉钉推送信息并在钉钉上创建审批流完成审批
    ConfigurationManager.GetSection()方法的使用
    C# 接口调用并解析json字符串
    线程与进程的区别
    Qt 事件的产生与处理
    java中Random的使用
  • 原文地址:https://www.cnblogs.com/starcor/p/10127869.html
Copyright © 2020-2023  润新知