码迷,mamicode.com
首页 > 其他好文 > 详细

django 基础

时间:2020-03-02 22:57:28      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:loop   conf   editable   classes   choices   content   lte   rom   install   

 

基本配置

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

django 基础

标签:loop   conf   editable   classes   choices   content   lte   rom   install   

原文地址:https://www.cnblogs.com/JcrLive/p/12398275.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!