django 基础 - jcr

django 基础 - jcr

 

基本配置

一、创建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/