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()


原文地址:https://www.cnblogs.com/starcor/p/10127869.html