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后的目录(请忽略名字......)

django 基础

 

三、配置文件   settings.py

1、数据库

django 基础
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

django 基础
# 在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对象,则直接将该对象返回给用户。

django 基础

 

 

自定义中间件

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/

上一篇:Jupyter Notebook安装扩充插件


下一篇:kail 更新源