美文网首页
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