• Django_collections01


    python manage.py flush

    python manage.py changepassword username

    python manage.py createsuperuser

    python manage.py dumpdata appname > appname.json

    python manage.py loaddata appname.json
    python manage.py shell
    #coding:utf-8
    from django.shortcuts import render
    from django.http import HttpResponse
    def add(request):
        a = request.GET['a']
        b = request.GET['b']
        c = int(a)+int(b)
        return HttpResponse(str(c))

    http://127.0.0.1:8000/add/?a=4&b=5

    不带参数的:
    {% url 'name' %}
    带参数的:参数可以是变量名
    {% url 'name' 参数 %}
    

    Templates

    <!DOCTYPE html>
    <html>
    <head>
        <title>{% block title %}默认标题{% endblock %} - 自强学堂</title>
    </head>
    <body>
    {% include 'nav.html' %}
    {% block content %}
    <div>这里是默认内容,所有继承自这个模板的,如果不覆盖就显示这里的默认内容。</div>
    {% endblock %}
    {% include 'bottom.html' %}
    {% include 'tongji.html' %}
    </body>
    </html>

    继承

    {% extends 'base.html' %}
    {% block title %}欢迎光临首页{% endblock %}
    {% block content %}
    {% include 'ad.html' %}
    这里是首页,欢迎光临
    {% endblock %}
    

    Django 模板查找机制: Django 查找模板的过程是在每个 app 的 templates 文件夹中找(而不只是当前 app 中的代码只在当前的 app 的 templates 文件夹中找)。各个 app 的 templates 形成一个文件夹列表,Django 遍历这个列表,一个个文件夹进行查找,当在某一个文件夹找到的时候就停止,所有的都遍历完了还找不到指定的模板的时候就是 Template Not Found (过程类似于Python找包)。这样设计有利当然也有弊,有利是的地方是一个app可以用另一个app的模板文件,弊是有可能会找错了。所以我们使用的时候在 templates 中建立一个 app 同名的文件夹,这样就好了。

    这就需要把每个app中的 templates 文件夹中再建一个 app 的名称,仅和该app相关的模板放在 app/templates/app/ 目录下面,

    例如:项目 zqxt 有两个 app,分别为 tutorial 和 tryit

     

    zqxt
    ├── tutorial
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── models.py
    │   ├── templates
    │   │   └── tutorial
    │   │       ├── index.html
    │   │       └── search.html
    │   ├── tests.py
    │   └── views.py
    ├── tryit
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── models.py
    │   ├── templates
    │   │   └── tryit
    │   │       ├── index.html
    │   │       └── poll.html
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── zqxt
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
    

    这样,使用的时候,模板就是 "tutorial/index.html" 和 "tryit/index.html" 这样有app作为名称的一部分,就不会混淆。

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    ...
                    'django.template.context_processors.request',
                    ...
                ],
            },
        },
    ]
    {{ request.user }}
    {% if request.user.is_authenticated %}
        {{ request.user.username }},您好!
    {% else %}
        请登陆,这里放登陆链接
    {% endif %}
    {{ request.path }}
    {{ request.GET.urlencode }}

    Model

    获取对象有以下方法:
    
    Person.objects.all()
    
    Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
    
    Person.objects.get(name=name)
    
    get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
    
    Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
    
    Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
    
    
    Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
    
    Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
    
    Person.objects.filter(name__regex="^abc") # 正则表达式查询
    
    Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
    
    
    filter是找出满足条件的,当然也有排除符合某条件的
    
    Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
    
    Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的

    Admin

    1.定制加载的列表, 根据不同的人显示不同的内容列表,比如输入员只能看见自己输入的,审核员能看到所有的草稿,这时候就需要重写get_queryset方法
    
    class MyModelAdmin(admin.ModelAdmin):
        def get_queryset(self, request):
            qs = super(MyModelAdmin, self).get_queryset(request)
            if request.user.is_superuser:
                return qs
            else:
                return qs.filter(author=request.user)

    settings

    运行 django-admin.py startproject [project-name] 命令会生成一系列文件,在Django 1.6版本以后的 settings.py 文件中有以下语句:
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    这里用到了python中一个神奇的变量 __file__ 这个变量可以获取到当前文件(包含这个代码的文件)的路径。os.path.dirname(__file__) 得到文件所在目录,再来一个os.path.dirname()就是目录的上一级,BASE_DIR 即为 项目 所在目录。我们在后面的与目录有关的变量都用它,这样使得移植性更强。
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    TEMPLATE_DEBUG = True
    DEBUG=True 时,如果出现 bug 便于我们看见问题所在,但是部署时最好不要让用户看见bug的详情,可能一些不怀好心的人攻击网站,造成不必要的麻烦。
    
    ALLOWED_HOSTS = ['*.besttome.com','www.ziqiangxuetang.com']
    ALLOWED_HOSTS 允许你设置哪些域名可以访问,即使在Apache中绑定了,这里不允许的话,也是不能访问的。
    
    当 DEBUG=False 时,这个为必填项,如果不想输入,可以用 ALLOW_HOSTS = ['*'] 来允许所有的。
    
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR,'static')
    static 是静态文件所有目录,比如 jquery.js, bootstrap.min.css 等文件。
    
    一般来说我们只要把静态文件放在 APP 中的 static 目录下,部署时用 python manage.py collectstatic 就可以把静态文件收集到 STATIC_ROOT 目录,但是有时我们有一些共用的静态文件,这时候可以设置 STATICFILES_DIRS 另外弄一个文件夹,如下:
    
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, "common_static"),
        '/var/www/static/',
    )
    这样我们就可以把静态文件放在 common_static 和 /var/www/static/中了,Django也能找到它们。
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR,'media')
    media文件夹用来存放用户上传的文件,与权限有关,详情见  Django 静态文件 和   Django 部署
    
    
    
    有时候有一些模板不是属于app的,比如 baidutongji.html, share.html等,
    
    Django 1.5 - Django 1.7
    
    
    TEMPLATE_DIRS = (
        os.path.join(BASE_DIR, 'templates').replace('\', '/'),
        os.path.join(BASE_DIR, 'templates2').replace('\', '/'),
        # ...
    )
    Django 1.8 及以上版本
    
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [
                os.path.join(BASE_DIR,'templates').replace('\', '/'),
                os.path.join(BASE_DIR,'templates2').replace('\', '/'),
            ],
            'APP_DIRS': True,
    ]
    这样 就可以把模板文件放在 templates 和 templates2 文件夹中了。

    Stacic

    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    
    MEDIA_ROOT = os.path.join(BASE_DIR,'media/')
    MEDIA_URL = '/media/'
    
    python manage.py collectstatic
    这一句话就会把以前放在app下static中的静态文件全部拷贝到 settings.py 中设置的 STATIC_ROOT 文件夹中
    
    ngnix
    location /media  {
        alias /path/to/project/media;
    }
     
    location /static {
        alias /path/to/project/collected_static;
    }
    
    STATIC_ROOT = os.path.join(BASE_DIR,'static/')
    STATIC_URL = '/static/'
    

    Session

    Django完全支持也匿名会话,简单说就是使用跨网页之间可以进行通讯,比如显示用户名,用户是否已经发表评论。session框架让你存储和获取访问者的数据信息,这些信息保存在服务器上(默认是数据库中),以 cookies 的方式发送和获取一个包含 session ID的值,并不是用cookies传递数据本身。

    编辑settings.py中的一些配置
    
    MIDDLEWARE_CLASSES 确保其中包含以下内容
    
    'django.contrib.sessions.middleware.SessionMiddleware',
    INSTALLED_APPS 是包含
    
    'django.contrib.sessions',
    

    比如写一个不让用户评论两次的应用:

    from django.http import HttpResponse
     
    def post_comment(request, new_comment):
        if request.session.get('has_commented', False):
            return HttpResponse("You've already commented.")
        c = comments.Comment(comment=new_comment)
        c.save()
        request.session['has_commented'] = True
        return HttpResponse('Thanks for your comment!')
    

     一个简化的登陆认证:

    def login(request):
        m = Member.objects.get(username=request.POST['username'])
        if m.password == request.POST['password']:
            request.session['member_id'] = m.id
            return HttpResponse("You're logged in.")
        else:
            return HttpResponse("Your username and password didn't match.")
             
             
    def logout(request):
        try:
            del request.session['member_id']
        except KeyError:
            pass
        return HttpResponse("You're logged out.")
    

      JAVASCRIPT

    <script type="text/javascript">
        var List = {{ List }};
        alert(List);
    </script>
    

      Django 通用视图,Djano Ajax

       

     

     

  • 相关阅读:
    python使用openpyxl操作execl
    python 修改、读取图片元数据
    python 利用pyttsx3文字转语音(转)
    SQL学习——SELECT INTO和INSERT INTO SELECT
    iOS开发环境搭建 及 编写1个hello world
    xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
    头疼3-4次的问题,数据从DB导出到EXCEL,再从EXCEL导入到DB,数据格式发生错误 ,导致 程序出错。
    安卓自动打包持续集成
    jenkins实现master变化时,才触发构建(过滤分支)
    配置github的pull request触发jenkins自动构建
  • 原文地址:https://www.cnblogs.com/xiaojikuaipao/p/5788917.html
Copyright © 2020-2023  润新知