• Django基础(二)


    url配置系统

    1.无名分组

    urlpatterns = [
      url(r'admin/', admin.site.urls),
      url(r'^blog/article/(d+)/$', blog_views.article_year),
      url(r'^blog/article/(d+)/(d+)$', blog_views.article_yearMonth),
    ]
    def article_year(request, year):
        return HttpResponse(str(year))
    
    def article_yearMonth(request, year, month):
        return HttpResponse('OK'+year+month)

    2.有名分组

    url(r'^blog/article/(?P<year_id>d+)/(?P<month_id>d+)$', blog_views.article_yearMonth),
    def article_yearMonth(request, year_id, month_id):
    
      return HttpResponse('OK'+year_id+month_id)

    3.路由分发

    根据app进行url分发,目的是解耦

    from django.conf.urls import url,include
    
    urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^blog/', include('blog.urls')),
    
    ]
    #blogurls.py
    from blog import views as blog_views
    
    urlpatterns = [
      url(r'article/(d+)$, blog_views.article_year'),
      url(r'^article/(d+)/(d+)$', blog_views.article_yearMonth),
    ]

    4.url反向解析

    urlpatterns = [
      url(r'^blog/', include('blog.urls')),
      url(r'^login.html/', app01_views.login, name='LOGIN')
    ]
    #app01views.py
    def login(request):
      if request.method == 'POST':
        user=request.POST.get('user')
        pwd=request.POST.get('pwd')
        return HttpResponse('登陆成功')
      return render(request, 'login.html')
    #login.html
    <form action='{% url 'LOGIN' %}' method='post'>
      <p>姓名 <input type='text' name='user'/></p>
      <p>密码 <input type='password' name='pwd'/></p>
      <input type='submit'>
    </form>

    视图函数

    1.请求对象

    request(请求对象):

      request.GET      ---- get请求数据

      request.POST    ---- post请求数据

      request.method  ---- 请求方式

      request.path       ---- 请求路径

      request.get_full_path()   ---- 请求全路径

      request.getlist()   ---- 请求数据(涉及到select等多选的属性时用到,select中需要写上multiple)

    2.响应对象

      HttpResponse()

      render(request,template_name,context)

        template:模板

        context:上下文

      redirect(跳转,重定向)

        redirect('/路径/')

      模拟点击submit请求:

      请求url:http://127.0.0.1:8000/login/

        (1)请求url:/login/  POST

        (2)url(r'^login', app01_views.login, name='LOGIN'),

        (3)llogin(request): 验证,   if 成功: redirect('/index/')

      重定向请求:

        请求路径:http://127.0.0.1:8000/index/

        (1)/index/  GET

        (2)url(r'index/', app01_views, name='index')

        (3)index(request):  从数据库取出数据,渲染到index.html页面

      用户看到的是:渲染好的index.html页面

    模板语法

    功能:为了更有逻辑的将数据库中的数据渲染到模板中

    1.渲染变量

    变量:{{ }}

      深度查询: 句点符.

    标签:{% %}

       {% for i in obj %}{% endfor %}

            {% if n > 20 %}{% else %}{% endif %}

            {% for i in obj %}{% empty %}<p>没有</p>{% endfor %}

    2.变量过滤器

    {{ var|filter_name:参数 }}

      {{ age|add:10 }}:值在原来的基础上加10  

      {{ date|date:"Y-m-d" }}:输出的时间格式改变

      {{ value|default:'值为空' }}:从数据库无法取到数据时,这样显示更友好

      {{ value|length }}:显示长度

      {{ value|slice:"2:-1" }}:截取

      {{ value|truncatechars:"20" }}:按照字符截断

      {{ value|truncatewords:"4" }}:按照单词截断

      {{ value|safe }}:对HTML和JS标签不进行自动转义

    3.自定义过滤器和标签

    a.在settings中的INSTALLED_APPS配置当前app,

    b.在app中创建templatetags模块

    c.在templatetags模块中创建任意.py文件,如:my_tag.py

    from django import template
    from django.utils.safestring import mark_safe
    
    register=template.Library()
    
    @register.filter
    def filter_multi(v1, v2):
        return v1*v2
    
    @register.simple_tag
    def simple_tag_multi(v1, v2):
        return v1*v2
    
    @register.simple_tag
    def my_input(id, arg):
        result="<input type='text' id='%s' class='%s'>" % (id, arg,)
        return mark_safe(result)
    View Code

    d.在使用自定义simple_tag和filter的html文件中导入创建的my_tag.py

    {% load my_tag %}

    e.使用simple_tag和filter

    {{ num|filter_multi:12 }}

    {% multi_tag n 5 2 %}

    {% if num|multi:10 > 100 %}{% else %}{% endif %}

    区别:

    a.自定义的filter只能接受两个参数

    b.自定义的simple_tag不能与if使用

    4.继承

    {% extends "base.html" %}  ---> 继承母版

    {% block content %}My amazing blog{% endblock %}  ---> 编写扩展内容

    {{ block.super }} --> 继续引用父类的内容

    ORM系统

      映射关系

        表名 <----> 类名

        字段 <----> 属性

        表记录 <----> 类实例对象

    #models.py
    
    class Book(models.Model):
    
      id=models.AutoField(primary_key=True)
      title=models.CharField(max_length=32)
      pubDate=models.DateField()
      price=models.DecimalField(max_digits=6,decimal_places=2)
      publish=models.CharField(max_length=32)
    python manage.py makemigrations
    python manage.py migrate

    数据库引擎更改:

    MYsqlDB--->pymysql

    在应用的__init__文件中加入:

        import pymysql

        pymysql.install_as_MySQLdb()

    单表操作:

        插入数据方式1:create有返回值---插入的记录对象

            book_obj=models.Book.objects.create(title=title,pubDate=pubdate,price=price,publisher_id=publish_id)

            print(book_obj.title)

            print(book_obj.price)

        插入数据方式2:

            book_obj=models.Book.objects.create(title=title,pubDate=pubdate,publish=publish)

            book_obj.price=price

            book_obj.save()

    ORM表关系:

        一对多:

      一对多添加

            关联字段放在多的一方

            # 添加数据方式1

            publish_obj=models.Publish.objects.get(name='renmin')

            book_obj=models.Book.objects.create(title='python',price=122,pubDate='2012-12-12',publisher=publish_obj)

            # 添加数据方式2

            book_obj=models.Book.objects.create(title='python',price=122,pubDate='2012-12-12',publisher_id=publish_obj.id)

            book_obj=models.Book.objects.create(title='python',price=122,pubDate='2012-12-12',publisher_id=2)

            # 添加数据方式3

            obj=models.Book(title='python',price=122,pubDate='2012-12-12',publisher=publish_obj)

            obj.save()

      一对多查询

            book_python=models.Book.objects.filter(title="python").first()

            print(book_python.title)

            print(book_python.price)

            print(book_python.publisher)  # Publish object  :返回的是与这本书关联的出版社对象

            print(book_python.publisher.name) 

        多对多:

            创建第三张表

        一对一:

            关联字段可以放在两张表的任意一张,关联字段必须唯一约束

    ORM查询API:

    a. models.Book.objects.all()  --> 查询全部,返回queryset

    b. booklist=models.Book.objects.filter(price=134,title='数学书') --> 过滤,返回queryset   # [obj1,]

    c. book_obj=models.Book.objects.get(title='数学书') ---> 返回model对象,也就是类对象。没有必要通过索引取值,print(book_obj.title),

        而且get()括号中取出的值必须唯一,返回结果有且只能有一个,多了就会报错,所以get后面用一般用id来做,保证唯一性,models.Book.objects.get(id=11)

    d. 如果返回的是queryset,就可以调用first(),last()

        book_obj1=models.Book.objects.all().first().first()

        print(obj.title)

        book_obj2=models.Book.objects.filter(price=134).last()

    e. book_obj=models.Book.objects.exclude(price=134)  与filter()相反,过滤出不符合条件的QuerySet   [obj1,obj2,]

        for book in book_obj:

            print(book.title)

    f. count:返回对象的个数

       count=models.Book.objects.exclude(price=134).count()

        print(count)

    g. order_by()

        book_list=models.Book.objects.all().order_by("price")

        for i in book_list:

            print(i.title, i.price)

        从大到小排列

        book_list=models.Book.objects.all().order_by("-price")

    h. reverse()反转

        book_list=models.Book.objects.all().order_by("-price").reverse()

    i. values(),存的是字典

        rel=models.Book.objects.all().values(“title”)  返回QuerySet,里面是一个个的字典 [{},{},]

        print(rel)    # <QuerySet [{'title':'语文书'},{'title':'数学书'},{'title':'英语书'},{'title':'物理书'}]>

    j. values_list(),存的是元组

        rel=models.Book.objects.all().values_list(“title”)

        print(rel)  # <QuertSet [('语文书',),('数学书',),('英语书',)]>

    k. exist(),判断是否有值,有值后再做其他操作

        ret=models.Book.objects.all().exist()

        if ret:

            print('OK')

        else:

            print('NO')

    单表查询之双下划线:

    首先在settings里面加入如下配置:

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    View Code

    以后只要执行ORM操作,sql语句就会打印出来

    模糊查询:

    book_list=models.Book.objects.filter(id__get=8)    # id>8的输出出来,返回的是QuerySet

    print(book_list.count())

    book_list2=models.Book.objects.filter(title__startswith='语')

    print(book_list[0].title)

    book_list3=models.Book.objects.filter(title__icontains='py')

    print(book_list[0].title)

    models.Tb1.objects.filter(id__lt=10, id__gt=1)  # 获取id>1且id<10的值

    models.Tb1.objects.filter(id__in=[11, 22, 33])   #获取id等于11,22,33的数据 

    models.Tb1.objects.filter(id__range=[1, 2])  # 范围 between and 

     

  • 相关阅读:
    dll相对路径设置
    OPC UA Error: Could not add self-signed certificate to certficate store.
    PB调用C#封装的视频插件中拍照方法不生效的问题
    net反射加载出现错误: ex = {“无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。”}
    xtralayout模式下,修改 layOutcontrolgroup分组框表头背景颜色步骤
    abap 本地包 生成请求号
    PB调用SAP的Web Service结构体数组参数方法详解(使用C#调用Web Service生成dll)
    zookeeper NIOServerCnxn: Too many connections from IP- max i
    mysql 10038错误解决方案
    PHP获取文件夹内所有文件包括子目录文件的名称或路径
  • 原文地址:https://www.cnblogs.com/Ryans-World/p/7777505.html
Copyright © 2020-2023  润新知