About Django

Django:

安装Django

pip3 install django

创建Django工程

django-admin startproject projectName
    projectName
        - projectName       # 对整个程序进行配置
            - init
            - settings      # 配置文件
            - url           # URL对应关系
            - wsgi          # 遵循WSIG规范,uwsgi + nginx
        - manage.py         # 管理Django程序:
                                - python manage.py 
                                - python manage.py startapp xx
                                - python manage.py makemigrations
                                - python manage.py migrate

运行Django功能

python manage.py runserver 127.0.0.1:8001

创建app

cd [project]
python manage.py startapp submit
app:
    migrations     数据修改表结构
    admin          Django为我们提供的后台管理
    apps           配置当前app
    models         ORM,写指定的类  通过命令可以创建数据库结构
    tests          单元测试
    views          业务代码

同一目录下创建templates和static 文件夹并在setting文件中配置参数,增加templates中的'DIRS'值,增加static路径

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',
                ],
            },
        },
    ]

配置静态目录static,用于存放css和js,html中引用需要<link rel="stylesheet" href="../../static/css/style.css">

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

settings.py中注释csrf

middlerware #中继器

定义路由规则在url.py中配置路由

"login" --> view.函数名

定义视图函数

app下views.py
    def func(request):
        # request.method   GET / POST
        # http://127.0.0.1:8009/home?nid=123&name=Doltt
        # request.GET.get('',None)   # 获取请求发来的而数据
        # request.POST.get('',None)                             
        # return HttpResponse("字符串") # 直接回应字符串
        # return render(request, "HTML模板的路径") #渲染模板
        # return redirect('/只能填URL')

模板渲染

特殊的模板语言:

-- {{ 变量名 }}    
    def func(request):
        return render(request, "index.html", {'varName': "Doltt"})  
  • 例子:
//index.html
    <html>
    ..
        <body>
            <div>{{varName}}</div>
        </body>
    </html> 
  • 在后台requset最后生成的字符串
    <html>
    ..
        <body>
            <div>Doltt</div>
        </body>             
    </html>

For循环

    def func(request):
        return render(request, "index.html", {'current_user': "Doltt", 'user_list': ['Doltt','eric']})
  • 例子:
//index.html
    <html>
    ..
        <body>
            <div>{{current_user}}</div>
            <ul>
                {% for row in user_list %}                          
                    {% if row == "Doltt" %}
                        <li>{{ row }}</li>
                    {% endif %}                             
                {% endfor %}
            </ul>                       
        </body>             
    </html>         

索引

    def func(request):
        return render(request, "index.html", {
                    'current_user': "Doltt", 
                    'user_list': ['Doltt','eric'], 
                    'user_dict': {'k1': 'v1', 'k2': 'v2'}})     
  • 例子:
//index.html
    <html>
    ..
        <body>
            <div>{{current_user}}</div>
            <a> {{ user_list.1 }} </a>
            <a> {{ user_dict.k1 }} </a>
            <a> {{ user_dict.k2 }} </a>                     
        </body>             
    </html>

条件

    def func(request):
        return render(request, "index.html", {
                    'current_user': "Doltt", 
                    "age": 18,
                    'user_list': ['Doltt','eric'], 
                    'user_dict': {'k1': 'v1', 'k2': 'v2'}})

  • 例子:
//index.html            
    <html>
    ..
        <body>
            <div>{{current_user}}</div>                     
            <a> {{ user_list.1 }} </a>
            <a> {{ user_dict.k1 }} </a>
            <a> {{ user_dict.k2 }} </a>                     
            {% if age %}
                <a>有年龄</a>
                {% if age > 16 %}
                    <a>老男人</a>
                {% else %}
                    <a>小鲜肉</a>
                {% endif %}
            {% else %}
                <a>无年龄</a>
            {% endif %}
        </body>             
    </html>

连接mysql

  1. 修改配置文件setting.py的数据库配置
DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            }
    }
  1. 在project目录下的init.py文件中添加代码:(Django默认使用MySQLdb模块链接MySQL)
    import pymysql
    pymysql.install_as_MySQLdb()
  1. 修改数据库对应的App的models.py文件
        from django.db import models
        # 定义一个类为表名
        # Create your models here.  
        class Sciencenews(models.Model):  
            id = models.CharField(max_length=36,primary_key=True)  
            first_module = models.CharField(max_length=30,default="News")  
            second_module = models.CharField(max_length=30,default="Latest News")  
            title = models.CharField(max_length=300)  
            author = models.CharField(max_length=60,null=True)  
            publish_date = models.CharField(max_length=35,null=True)  
            content = models.TextField(null=True)  
            crawl_date = models.CharField(max_length=35,null=True)  
            from_url = models.CharField(max_length=350,null=True)  
以上的TableName类名代表数据库的表名且继承了models.Model,类里面的字段代表数据表中的userName,数据类型由CharField(相当于varchar)、DateField(相当于datetime),max_length参数限定长度
  1. 增加配置文件setting.py中的INSTALL_APPS
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'AppName',
    ]
  1. 执行命令创建数据库表
    改动了model.py的内容之后执行makemigrations相当于在该app下建立migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py没有作用到数据库文件;执行migrate该改动作用到数据库文件,比如产生table之类
        python manage.py makemigrations
        python manage.py migrate    
  1. 数据库中的表名为App名_Class名
    app_className

前端获取值并传递后台

ORM执行mysql操作

  1. 字段:
    字符串类型
    数字
    时间
    二进制
    自增(primary_key=True)

  2. 字段的参数:

    null               -> db是否可以为空
    default            -> 默认值
    primary_key        -> 主键
    db_column          -> 列名
    db_index           -> 索引
    unique             -> 唯一索引
    unique_for_date    -> 
    unique_for_month
    unique_for_year
    auto_now           -> 创建时,自动生成时间
    auto_now_add       -> 更新时,自动更新为当前时间
    # obj = UserGroup.objects.filter(id=1).update(caption='CEO')
    # obj = UserGroup.objects.filter(id=1).first()
    # obj.caption = "CEO"
    # obj.save()    
    choices           -> django admin中显示下拉框,避免连表查询
    blank             -> django admin是否可以为空
    verbose_name      -> django admin显示字段中文
    editable          -> django admin是否可以被编辑
    error_messages    -> 错误信息欠
    help_text         -> django admin提示
    validators        -> django form ,自定义错误信息(欠)            
    创建 Django 用户:python manage.py createsuperuser       
  1. 根据类对数据库表中的数据进行各种操作
    一对多:
    a.
    外键
    b.
    外键字段_id
    c.
    models.tb.object.create(name='root', user_group_id=1)
    d.
    userlist = models.tb.object.all() for row in userlist: row.id row.user_group_id row.user_group.caption
  2. 给用户返回数据:
    render(request, "模板的文件的路径", {'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})
    redirect("URL")
    HttpResponse(字符串)
  1. 基本增删改查操作
        models.User.objects.create(name='qianxiaohu',age=18)
        dic = {'name': 'xx', 'age': 19}
        models.User.objects.create(**dic)                   
            obj = models.User(name='qianxiaohu',age=18)
            obj.save()
        models.User.objects.filter(id=1).delete()
        models.User.objects.filter(id__gt=1).update(name='Doltt',age=84)
        dic = {'name': 'xx', 'age': 19}
        models.User.objects.filter(id__gt=1).update(**dic)
        models.User.objects.filter(id=1,name='root')
        models.User.objects.filter(id__gt=1,name='root')
        models.User.objects.filter(id__lt=1)
        models.User.objects.filter(id__gte=1)
        models.User.objects.filter(id__lte=1)       
        models.User.objects.filter(id=1,name='root')
        dic = {'name': 'xx', 'age__gt': 19}
        models.User.objects.filter(**dic)
        v1 = models.Business.objects.all()
        # QuerySet ,内部元素都是对象        
        # QuerySet ,内部元素都是字典
        v2 = models.Business.objects.all().values('id','caption')
        # QuerySet ,内部元素都是元组
        v3 = models.Business.objects.all().values_list('id','caption')  
        # 获取到的一个对象,如果不存在就报错
        models.Business.objects.get(id=1)
        对象或者None = models.Business.objects.filter(id=1).first() 
  1. 外键:
        v = models.Host.objects.filter(nid__gt=0)
        v[0].b.caption  ---->  通过.进行跨表  
            class UserType(models.Model):
                caption = models.CharField(max_length=32)
              id  caption
            # 1,普通用户
            # 2,VIP用户
            # 3, 游客
        ----        
            class User(models.Model):
                age = models.IntergerFiled()
                name = models.CharField(max_length=10)#字符长度
                # user_type_id = models.IntergerFiled() # 约束,
                user_type = models.ForeignKey("UserType",to_field='id') # 约束,
              name age  user_type_id     
            # 张扬  18     3
            # 张A扬 18     2
            # 张B扬 18     2
    position:fixed absolute relative    
    Ajax
    
        $.ajax({
            url: '/host',
            type: "POST",
            data: {'k1': 123,'k2': "root"},
            success: function(data){
                // data是服务器端返回的字符串
                var obj = JSON.parse(data);
            }
        })
        

建议:永远让服务器端返回一个字典
return HttpResponse(json.dumps(字典))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容