• django 基础


     

    基本配置

    一、创建django程序

    • 终端命令:
    • django-admin startproject sitename        IDE创建django程序时,本质上都是自动执行上述命令

      其他常用命令:进入工程目录

        python manage.py runserver 127.0.0.1 端口号       运行测试
        python manage.py startapp appname  添加app
        python manage.py makemigrations     
        python manage.py migrate      上两个命令一起使用,加载数据库     

    •   python manage.py createsuperuser   创建superuser

    二、程序目录   添加app后的目录(请忽略名字......)

    三、配置文件   settings.py

    1、数据库

    DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'dbname',
        'USER': 'xxx',
        'PASSWORD': 'xxx',
        'HOST': '',
        'PORT': '',
        }
    }
    
    
    # 由于Django内部连接MySQL时使用的是MySQLdb模块,但python3中没有此模块,所以需要使用pymysql来代替
      
    # 在上图与项目名相同的文件中的__init__.py 文件中添加
      
    import pymysql
    pymysql.install_as_MySQLdb() 
    配置数据库

    2、静态文件

    1 STATICFILES_DIRS = (
    2         os.path.join(BASE_DIR,'static'),
    3     )

    路由系统

     1、单一路由

    1 urlpatterns = [
    2     path('xxx/', views.xxx),
    3 ]

    2、正则路由

    1 re_path('^(w+)/(w+)/download/(d+)$', views.download,),
    2 re_path('^(w+)/(w+)/downloads/(d+)/(?<id>d+)$', views.downloads,) ,

    3 #为防止冲突,尽量加上^和$

    3、额外的参数

    1 re_path('^(w+)/(w+)/downloads/(d+)/(?<id>d+)$', views.downloads,{‘id’:11}),
    2 # 用的不多 

    4、为路由映射设置名称  

    1 path('xxx/', views.xxx, name='xxx'),
    2 # 同正则

    设置名称之后,可以在不同的地方调用,如:

    • 模板中使用生成URL     {% url 'xxx' 参数 %}
    • 函数中使用生成URL     reverse('xxx', args=(参数,))      from django.urls import reverse
    • Model中使用获取URL  自定义get_absolute_url() 方法
    •  1 class NewType(models.Model):
       2     caption = models.CharField(max_length=16)
       3 
       4 
       5     def get_absolute_url(self):
       6         """
       7         为每个对象生成一个URL
       8         应用:在对象列表中生成查看详细的URL,使用此方法即可!!!
       9         :return:
      10         """
      11         # return '/%s/%s' % (self._meta.db_table, self.id)
      12         #
      13         from django.urls import reverse
      14         return reverse('NewType.Detail', kwargs={'nid': self.id})

      # 获取请求匹配成功的url:request.resolver_match

    5、路由分发   

     path('^xx/',include('xx.urls')),   # from django.urls import include

    路由系统

    1、模版执行

    #一般用的是这三个
    from django.shortcuts import render, HttpResponse, redirect
    
    
    def xxx(request):
        ...
        return render(request, '模板路径', [传到前端的参数{key:value,...}])
        # return redirect('路径')    # 重定向
        # return HttpResponse('传到前端的内容')
    
    # 其本质都是HttpResponse    看源码

    2、模版语言

      • {{ item }}
      • {% for item in item_list %}  {{ item }}  {% endfor %}
          forloop.counter
          forloop.first
          forloop.last 
      • {% if ordered_warranty %}  {% else %} {% endif %}
      • 母板:{% block title %}...{% endblock %}
        子板:{% extends "base.html" %}
           {% block title %}...{% endblock %}

    3、simple_tag

    # 在app中创建templatetags模块
    # 创建文件 xx.py
    
    
    
    
    #!/usr/bin/env python
    #coding:utf-8
    from django import template
    from django.utils.safestring import mark_safe
       
    register = template.Library()
       
    @register.simple_tag
    def my_simple_time(参数):
        return  ...
       
    @register.simple_tag
    def my_input(id,arg):
        result = "<a href='#'></a>" 
        return mark_safe(result)
    
    # return内容即渲染内容
    
    
    
    
    # 在使用simple_tag的html文件中导入之前创建的 xx.py 文件名
    {% load xx %}
    
    
    #使用simple_tag
    {% my_simple_time [参数]%}
    {% my_input %}
    可直接传入render() 传来的参数
    流程

    流程走完无法使用???

    django 还不知道去哪里加载simple_tag

    so 需要告诉它怎么找

    在settings中配置app

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'xxxapp.apps.xxxappConfig',
        'xxxapp.templatetags',
    ]
    
    
    
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
                'libraries': {
                    'my_tags': 'xxx.templatetags.my_tags',
                    'src_tags': 'xxxapp.templatetags.src_tags',
                    'stu_tags': 'xxxx.templatetags.stu_tags',
                }
            },
        },
    ]
    
    
    
    更多:https://docs.djangoproject.com/en/1.10/ref/templates/language/

    中间件

    django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

    在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件。

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'xxx.middleware.xx.Authentication'
    ]
    # 在根项目文件夹中xxx/middleware的xx.py文件中Authentication类
    
    process_request(self,request)
    process_view(self, request, callback, callback_args, callback_kwargs)
    process_template_response(self,request,response)
    process_exception(self, request, exception)
    process_response(self, request, response)
    
    以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。

    自定义中间件

    class xxxx(object):
          
        def process_request(self,request):
            pass
        def process_view(self, request, callback, callback_args, callback_kwargs):
            i =1
            pass
        def process_exception(self, request, exception):
            pass
          
        def process_response(self, request, response):
            return response


    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'xxx.middleware.xx.xxxx'
    ]

    admin

    由django提供的后台管理系统

    # 创建superuser
    python manage.py createsuperuser   #文章开头
    
    
    # models.py 中添加表       文章开头命令加载数据库
    
    class Customer(models.Model):
        name = models.CharField(max_length=32, blank=True, null=True)
        qq = models.CharField(max_length=64, unique=True)
        phone = models.CharField(max_length=64, blank=True, null=True)
        email = models.EmailField(verbose_name='常用邮箱', blank=True, null=True)
        status_choices = ((0, '已购买'),
                          (1, '未购买'))
        status = models.SmallIntegerField(choices=status_choices, default=0)
        product = models.ForeignKey('Product', on_delete=models.CASCADE)
        consultant = models.ForeignKey('UserProfile', on_delete=models.CASCADE)
        tag = models.ManyToManyField('Tag')
        date = models.DateTimeField(auto_now_add=True)  # 自动添加
    
        def __str__(self):
            return '{},{}'.format(self.qq, self.name)
    
        class Meta:
            verbose_name = '客户'
            verbose_name_plural = '客户'
    
    在admin.py 中配置
    from django.contrib import admin
    
    # Register your models here.
    class CustomerAdmin(admin.ModelAdmin):
        flist_display = ('id', 'name', 'qq', 'date', 'consultant')   # 展示字段
        list_filter = ('date',)   # 检索
        search_fields = ('qq', 'name') # 搜索
        raw_id_fields = ('consultant',)  #对fk可直接编辑多个
        filter_horizontal = ('tag',)   # manytomany 的复选框
        list_editable = ('consultant',)  # 设置可编辑字段
        list_per_page = 5  # 每一页显示条数
        readonly_fields = ('qq',) #只读字段
        readonly_table = False  # 只读表
    admin.site.register(models.Customer, CustomerAdmin)
    admin.site.register(models.Product)

    更多:http://docs.30c.org/djangobook2/chapter06/

  • 相关阅读:
    Flask11 Session、CSRF、注销session、利用端点自动跳转
    python学习笔记4-时间函数
    python学习笔记3-循环1
    python学习笔记2-条件语句
    python学习笔记1-基础语法
    sprintf系列函数
    sscanf非常的重要
    c++中.c_str和.c_data
    c++Map用法
    c语言sscanf总结
  • 原文地址:https://www.cnblogs.com/JcrLive/p/12398275.html
Copyright © 2020-2023  润新知