美文网首页
About Django

About Django

作者: Doltt | 来源:发表于2017-10-11 15:39 被阅读0次

    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(字典))

    相关文章

      网友评论

          本文标题:About Django

          本文链接:https://www.haomeiwen.com/subject/gpewyxtx.html