基本配置
一、创建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/