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
- 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
Django_collections01的更多相关文章
随机推荐
- morris的用法
參數選項說明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...
- 1121高性能MySQL之运行机制
本文来自于拜读<高性能MySQL(第三版)>时的读书笔记作者:安明哲转载时请注明部分内容来自<高性能MySQL(第三版)> MySQL的逻辑构架 MySQL服务器逻辑架构 最上 ...
- Android下常见动画
摘要:Android中常见的的动画有三种:属性动画.补间动画.帧动画. 注.因为前两种内容较多,后补 一.属性动画 二.补间动画 三.帧动画:本质是将一些连贯的图片加载形成连贯的动画效果 1.在Dra ...
- js 对象数组根据对象中的属性排序
function createComparisonFunction(propertyName){ return function(object1,object2){ var value1 = obje ...
- Android Material Design 控件常用的属性
android:fitsSystemWindows="true" 是一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为t ...
- Gitlab的搭建
从网上看了一大堆的资料,最终选定按照github上的文档来搭建,虽然本人英文不好,就这样看着 这个博客弯曲完全是拷贝过来的,只为了做个笔记 原文地址:https://github.com/gitlab ...
- 文本溢出省略解决笔记css
text-overflow:ellipsis; overflow:hidden; white-space:nowrap; *white-space:nowrap;
- bzoj 3743
这道题用到了4个dfs,分别是找出所有家的最小生成树,找出一点距离树的最小距离,找出每个点儿子距离的最大值(不包括父亲,也就是指不包括根节点的子树),用父亲的值来更新自己 因为我们可以知道:如果我们在 ...
- 100803C
画个图,很容易发现少兜圈子,就是说这些限制c[i],d[i]可以看做[c[i],d[i]],不让那些区间相交,然后就可以了 #include<iostream> #include<c ...
- js-处理div设置的编辑框处理焦点定位追加内容
具体实现方法如下: 首先要让DIV启用编辑模式 <div contenteditable=true id="divTest"></div> 通过设定cont ...