Django 学习记录

学习使用Django有一段时间了,期间也做过一些记录,希望能帮到大家!


2017-08-16
#Django
python manage.py startapp Users #生产新的应用

2017-08-19`
#Django
django-admin startproject 项目名称  #创建项目
python manage.py startapp app名称   #创建app
#settings配置
INSTALLED_APPS=(
    'django.contrib.admin',
       'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app',        #将自己的app添加进来
)

#可在此修改为mysql数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname',    #数据库名称
    'USER': 'root',
    'PASSWORD': 'root',
    'HOST':'',        #留空则为:localhost
    'PORT':'3306',
    }
}
#或sqlite3数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
#pymysql需要在app项目名下的__init__.py文件添加:
import pymysql
pymysql.install_as_MySQLdb()

#配置templates路径
TEMPLATES = [
    {
    '........'#在[]里面添加此句
    'DIRS': [os.path.join(BASE_DIR,'templates')],
    '........'
    }
]

#配置static路径
STATIC_URL='/static/'
STATICFILES_DIRS=(
    #告诉django static的路径
    os.path.join(BASE_DIR,"static"),
)

python manage.py runserver #运行项目

#同步数据库
python manage.py syncdb  #第一种方式,并可设置admin用户,密码
python manage.py makemigrations  #第二种方式,设置models后用这种
python manage.py migrate

2017-08-22`
'''个人博客网站,项目名称:mblog,默认sqlite3数据库'''
'''1.创建项目,创建app,配置settings.py
django-admin startproject mblog       #创建项目
python manage.py startapp mainsite #创建App
#配置settings.py
INSTALLED_APPS=[...,'mainsite',]   #把App加入列表
LANGUAGE_CODE='zh-CN'
TIME_ZONE='Asia/Beijing'    #设置时区
python manage.py migrate    #保存设置

'''2.创建博客数据表'''
#models.py定义数据模型
from django.db import models
from django.utils import timezone

class Post(models.Model):
    title=models.CharField(max_length=200)
    slug=models.CharField(max_length=200)
    body=models.TextField()
    pub_date=models.DateTimeField(default=timezone.now)

    class Meta:   #时间降序排序
        ordering=('-pub_date',)

    def __unicode__(self):
        return self.title
#同步数据库
python manage.py makemigrations app(app名可写可不写)
python manage.py migrate

#Django启动admin管理界面
python manage.py createsuperuser  #然后输入用户信息
#修改admin.py
from django.contrib import admin
from .models import Post
class PostAdmin(admin.ModelAdmin):
    list_display=('title','slug','pub_date')
admin.site.register(Post,PostAdmin)


2017-08-26`
#Django静态页面配置
1.在settings.py加入下面语句,再在根目录下创建static文件夹
STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]
2.使用时需在html文件前面加入{% load staticfiles %}
3.使用举例:<img src="{% static "images/a.jpg" %}">

#在models.Model中常用的字段格式说明
字段格式    , 可用参数, 说明
AutoField #自动增长的IntegerField
BigIntegerField, , 64位大整数
BooleanField, ,布尔值,只有True/False两种
CharField, max_length字符串最大长度, 存储较短字符串
DateField,auto_now对象被存储时自动加入当前日期 auto_now_add对象被创建时才加入, 可用于datetime.date
DatetimeField, 同上, 可用于datetime.datetime
DecimalField, max_digits可接受的最大位数, 定点小数数值数据,适用于Decimal模块的实例
EmailField, max_length最长字数, 电子邮件地址格式字段
FloatField, ,浮点数
IntegerField, ,整数
PostiveIntegerField, ,正整数
SlugField, max_length, 通常用来作为网址的一部分
TextField, ,长文字格式,一般用在HTML窗体的Textarea输入项目中
URLField, max_length, 常用来记录完整的URL网址
ForeignKey  添加外键,如ForeignKey('name',on_delete=models.CASCADE)
FileField   上传文件
ImageField #继承于FileField,对上传的内容进行校验,确保是有效的图片

    #各字段常用属性
null 是否接受空值,默认False
blank 是否接受存储空白内容,默认False
choices 以选项的方式(只有固定内容可选)作为此字段的候选值
default 输入此字段的默认值
help_text 字段的求助信息
primary_key 设置为KEY(主键),默认为False
unique 是否唯一,默认False
db_column  字段的名称,如未指定,则使用属性的名称
db_index  若值为True,则在表中为此字段创建索引,默认False
choices  下拉列表(下拉框)

#Django ORM常用函数及修饰词`
create()  创建一组记录,如:a=类名.objects.create(id=3,name='name')
save()      保存到数据库,如:a.save()
filter()  返回指定条件的QuerySet
exclude() 返回不符合指定条件的QuerySet
order_by() 针对某一指定字段进行排序
get()    获取指定条件的唯一元素,若没找到或不止一个就产生异常
first()/last()/all()  获取第一个元素/最后一个元素/所有的QuerySet
aggregate() 可以用来计算的聚合函数
exists()   用来检查是否存在某指令条件的记录
update() 更新某字段内容
delete() 删除指定记录
iexact    不区分大小写的条件设置
contains/icontains 设置条件为含有某一字符串就符合
in     提供一个列表,只要符合其中任何一个即可
gt/gte/lt/lte  大于/大于等于/小于/小于等于

#Template常用过滤器
addslashes  为字符串需要的地方加上转义字符
center,ljust,rjust 为字符串加上指定空格后居中,靠左,靠右对齐,如{{ msg|center:"10"}}
cut    在字符串中删除指定的子字符串,如{{msg|cut:" "}}删除空格
date      设置日期的显示格式,如{{value|date:"D d M Y"}}
default  若没有值,就使用默认值,如{{msg|default:"没有信息"}}
dictsort  为字典形式的变量排序,如{{value|dictsort:"name"}}以名字字段排序
divisibleby  测试数值是否可被指定的数整除,返回True/False,如{{value|divisibleby:5}}
escape  把字符串中的HTML标记变成显示用的字符串,如{{msg|escape}}
filesizeformat  显示文件的大小格式(KB,MB等)
first/last  只取出列表数据中的第一个/最后一个,如{{values|first}}
length     返回列表数据的长度,如{{values|length}}
length_is  测试数据是否为指定长度,如{{values|length_is:"1"}}
floatformat   以指定的浮点数格式显示数据,如{{value|floatformat:2}}两位小数
linenumber    为显示的文字加上行号,如{{msg|linenumbers}}
lower/upper    把字符串内存全部换成小写/大写
random        以随机数将前面的内容显示出来,如{{values|random}}
safe    标记字符串为安全的,不需要处理转义字符,如{{msg|safe}}
slugify    把字符串空格变成'-',让字符串可以安全放在网址栏上,如{{msg|slugify}}It's a变为Its-a
truncatechars 把过长的字符串截切成指定的长度,同时最好3个字符会转换成'...'
wordcount    计算字数,如{{msg|wordcount}}
yesno    按照值的内容为True,False,None显示对应内容,如{{value|yesno:"是,否,有可能"}}
slice   根据索引显示对应内容,如{{value|slice:'1'}},显示列表value的第一个元素,['x']

2017-08-27`
#template中的for循环
常用的参数:
cycle可用来设置隔行变色  forloop.parentloop用来存取上一层循环
forloop.counter0/counter循环计数器,从0/1开始
forloop.revcounter0/revcounter循环计数器,从最后开始,到0/1
forloop.first/last循环处于第一圈/最后一圈,才为True,其他时候为False
循环示例:      #表格实现隔行变色,按序排列
{% for good in conts %}
  {% if forloop.first %}
 <table><tr><td>名称</td><td>类型</td></tr>
  {% endif %}
  <tr bgcolor="{% cycle "red" "green" "#00f" %}"> #隔行变色,红,绿,蓝
    <td>{{forloop.counter0}}{{good.name}}</td>
  #counter0(从0开始),counter(从1开始)是计算当前是第几个循环的计数器,现用作序号
    <td>{{good.types}}</td>
  </tr>
  {% if forloop.last %}
 </table>
  {% endif %}
{% empty %}
  <h3>商场目前暂无商品</h3>
{% endfor %}

#窗体的使用`
1.创建forms.py文件,创建窗体类
from django import forms      #导入django的forms模块
class ContactForm(forms.Form):  #创建窗体类继承forms.Form
    CITY=[['北京','北京'],['GZ','广州'],['XA','西安'],]  #定义下拉框的列表
    user_name=forms.CharField(label='您的姓名',max_length=50,initial='李大仁') #姓名,长度50,默认为李大仁
    user_pawd=forms.CharField(label="密码",max_length=20,
widget=forms.PasswordInput()) #(密码框)设置密码显示为星号
    user_city=forms.ChoiceField(label='居住城市',choices=CITY)    #城市的下拉框
    user_school=forms.BooleanField(label='是否在学',required=False) #单选按钮
    user_email=forms.EmailField(label='电子邮件')    #电子邮件
    user_message=forms.CharField(label='您的意见',widget=forms.Textarea) #扩展为大量文字输入字段
2.设置views.py,并把urls.py设置好,这里不再说明
from django.shortcuts import render,RequestContext,redirect
from django.template.loader import get_template
from django.http import HttpResponse
from mysite import forms
def contact(request):
    if request.method=='POST':
        form=forms.ContactForm(request.POST)
        if form.is_valid():
            message="感谢您的来信."
            user_name=form.cleaned_data['user_name']#获取输入的值
            user_city=form.cleaned_data['user_city']
            user_school=form.cleaned_data['user_school']
            user_email=form.cleaned_data['user_email']
            user_message=form.cleaned_data['user_message']
        else:
            message="请检查您输入的信息是否正确!"
    else:
        form=forms.ContactForm()
    template=get_template('contact.html')
    requ_context=RequestContext(request)
    requ_context.push(locals())
    html=template.render(requ_context)

    return HttpResponse(html)
3.创建contact.html文件,主要内容如下
{% if message %}
{{message}}{{user_name}}<br/>
{% endif %}
<form name='my form' action='/contact/' method='POST'>
{% csrf_token %}
<h3>写信给管理员</h3>
{{ form.as_p }}
<input type='submit' value='提交'>
<input type='reset' value='重填'>
</form>

#重定向到另一个页面`
return HttpResponseRedirect('/page/')
#在Windows使用findstr查找文件包括的字符串
findstr/s "ch08" *.py #查找当前目录下所有包括"ch08"的py文件

2017-08-28`
#使用Mysql数据库时为了防止乱码,在建库时设置默认编码utf8
create database db default charset=utf8;

2017-08-29`
#include其他整组的urlpatterns设置
my_patterns=[
    url(r'^a/$',views.a),
    url(r'^b/$',views.b),
    url(r'^c/$',views.c),]
urlpatterns=[
    url(r'^info/',include(my_patterns)),]
    
#URLconf的反解功能`
url(r'^post/(\d{2})$',views.post,name='post-url')
#在html页面可配置成链接
<a href="{% url 'post-url' 01 %}">Show the Post</a>

2017-09-10`分页
#一.Paginator实现分页展示功能
#views.py代码
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
def listing(request):
    cont=Goods.objects.all()  #获得数据库所有行
    paginator=Paginator(cont,2) #每页显示2行
    page=request.GET.get('page') #获得请求的页码
    try:
        conts=paginator.page(page)#获得页码对应的页
    except PageNotAnInteger:    #若请求的页码不是数字
        conts=paginator.page(1)#获得第一页
    except EmptyPage:    #若请求的页码号超过最大页
        conts=paginator.page(paginator.num_pages)#获得最后页
    return render(request,'index.html',{'conts':conts,'paginator':paginator})

#index.html关键代码:
{% if conts %}
{% if conts.has_previous %} <!--如果还有上一页-->
<a href='?page={{conts.previous_page_number}}'>上一页</a>
{% else %}上一页
{%endif%}第{{conts.number}}页共{{paginator.num_pages}}页
{% if conts.has_next %} <!--如果还有下一页-->
<a href='?page={{conts.next_page_number}}'>下一页</a>
% else %}下一页
{% endif %}
{% for good in conts %}<!--循环展示此页-->
{{good.name}}
{{good.price}}
{{good.types}}
{% endfor %}
{% endif %}

二.高效分页
#views.py代码:
SIZE=3
def goodList_gx(rq):
    try:
        curPage = int(rq.GET.get('curPage', '1')) #第几页
        allPage = int(rq.GET.get('allPage', '1')) #总页数
        pageType = str(rq.GET.get('pageType', ''))#上/下页
    except:
        curPage=1;allPage=1;pageType='' #若有误,则给其默认值
    if curPage==1 and allPage==1: #只在第一次查询商品总条数
        goodCount = models.Goods.objects.count()
        allPage=goodCount/SIZE if goodCount%SIZE==0 else goodCount/SIZE + 1
    if pageType == 'pageDown': #下一页
        curPage+=1
    elif pageType == 'pageUp': #上一页
        curPage-=1
    if curPage < 1: curPage=1 #如果小于最小则等于1
    elif curPage > allPage: curPage=allPage #若大于最大则等于最大页
    startGood = (curPage - 1) * SIZE #切片开始处
    endGood = startGood + SIZE  #切片结束处
    goods = models.Goods.objects.all()[startGood:endGood] #切片查询(效率较高)
    return render(rq, 'goodList_gx.html', {'goods': goods, 'allPage': allPage, 'curPage': curPage})
#list.html关键代码:
{% if goods %}
    {% for good in goods %}
        {% if forloop.first %}<table border="1"> <!--如果是循环第一次-->
        <tr><td>编号</td><td>名称</td><td>价格</td><td>类型</td><td>操作</td></tr>
        {% endif %}
        <tr bgcolor="{% cycle '#ff0' 'green' %}"> <!--隔行变色-->
        <td>{{ good.id }}</td><td>{{ good.name }}</td><td>{{ good.price }}</td><td>{{ good.types }}</td>
        <td><a href="/update_good/{{ good.id }}">修改</a> <a href="/delete_good/{{ good.id }}">删除</a></td>
        </tr>
        {% if forloop.last %}</table>{% endif %} <!--如果是循环最后一次-->
    {% endfor %}
        {% ifnotequal curPage 1 %} <!--如果不是第一页-->
    <a href="?curPage={{ curPage }}&allPage={{ allPage }}&pageType=pageUp">上一页</a>
        {% else %}上一页{% endifnotequal %} <!--否则不能点击-->
    第{{ curPage }}共{{ allPage }}页
        {% ifnotequal curPage allPage %} <!--如果不是最后一页-->
    <a href="?curPage={{ curPage }}&allPage={{ allPage }}&pageType=pageDown">下一页</a>
        {% else %}下一页{% endifnotequal %}
{% else %}
    <h3>目前暂无商品</h3>
{% endif %}


2017-09-10 15:24`
Session的使用
一.常用函数:
set_expiry(30) #设置30秒后过期
set_expiry(datetime格式) #设置指定时间点过期
set_expiry_age() #返回还有多少秒过期
set_expiry_date() #返回Session的到期时刻
get_expiry_at_browser_close()#返回关闭浏览器是否到期
示例:              #设置0.001秒后过期,达到注销作用
request.session.set_expiry(0.001)
二.session的创建于取出:
request.session['name']='name'
if 'name' in request.session: #判断session是否存在'name'
  name=request.session['name']

2017-09-13`
#Ajax的使用(ajax)
一.html页面关键代码:
{% load staticfiles %}
  <script src="{% static 'js/jquery-1.12.4.js' %}"></script>
  <script>
    $(document).ready(function(){
        $("#id_name").blur(function(){
            var name=$("#id_name").val();
            if(name==null || name==""){
                $("#ajax").css('color','red').html('用户名不能为空!');
            }else{
            /*$.ajax({
                type:"GET",
                url:"/zcyz",
                data:{"name":name},
                success:callBack
            });*/
            $.get("/zcyz",{"name":name},callBack);
            }
            function callBack(datas){
                    if(datas==1){
                        $("#ajax").css('color','red').html('此号已被注册!');
                    }else{
                        $("#ajax").css('color','green').html('此号可以注册!');
                    }
                }
        });
    });
 </script>
二.views.py关键代码:
def zcyz(request):
    if request.method=='GET' and request.is_ajax():
        name=request.GET.get('name')
        names=Users.objects.filter(name=name)
        print(name)
        if names:
            datas=1
        else:
            datas=0
    else:
        datas=0
    return HttpResponse(datas)

2017-09-1312:38`
#在网站中建立自定义标签:
"""可以把自定义标签想象成一个在Template模板中调用Python函数的方法,其中xianshi就是函数名称,第一个参数就是'|'之前的id,若还需要第2个以及第3个参数,则要以':'的方式附加到自定义标签后"""
(1)在app(mysite)目录下创建一个templatetags文件夹
(2)在此文件夹创建一个空的__init__.py文件
(3)在此文件夹创建.py文件(在此命名为mvote.py),内容如下:
from django import template
from mysite import models
register=template.Library() #创建注册用的对象

@register.filter(name='xianshi')#注册自定义标签
def xianshi(value):
    try:
        s=models.Users.objects.get(id=int(value)).name
    except:
    s=None
    return s
(4)html页面的关键代码如下:
{% load mvote %}
{{ id | xianshi }}#id会被当作xianshi的参数,返回输出查询的name

2017-09-14`
Cookie的使用:
if request.session.test_cookie_worked() #判断是否支持cookie
response=HttpResponse(html) #必须先执行此段再写cookie
try:
  if name: response.set_cookie('name',name)#写入cookie
except:
  pass
return response

2017-09-17`
图形验证码的使用:
一.需要安装的模块有:
django-simple-captcha ,Pillow 以及six
二.settings.py的配置:
把'captcha'加入到INSTALLED_APPS区块中
三.urls.py的配置:
在urlpatterns加入:url(r'^captcha/',include('captcha.urls')),
四.在forms.py的窗体类加入如下语句(如窗体类为PostForm):
from django import forms
from captcha.fields import CaptchaField  #新加的
class PostForm(forms.ModelForm):
    captcha=CaptchaField()    #新加入的字段
    class Meta:
        model=models.Post
        fields=['name','pawd']

    def __init__(self,*args,**kwargs):
        super(UserForm,self).__init__(*args,**kwargs)
        self.fields['name'].label='账 号'
        self.fields['pawd'].label='密 码'
        self.fields['pawd'].widget=forms.PasswordInput()
        self.fields['captcha'].label='验证码' #新加的
五.html页面的配置:
(1)javascript里加入此段jQuery:
$("#id_captcha_1").attr('placeholder','输入验证码');
$("#cpt").click(function(){
    console.log('click');
    $.getJSON("/captcha/refresh/",
        function(result){
        $('.captcha').attr('src',result['image_url']);
        $('#id_captcha_0').val(result['key']);
    });
});
(2)form表单最后加入此段(进行验证码刷新):
<span id="cpt" style="cursor:pointer">看不清?换一张</span>

2017-09-24`
信息显示框架messages framework:
DEBUG调试    INFO信息
SUCCESS成功  WARNING警告  ERROR 错误
from django.contrib import messages
messages.add_message(request,messages.SUCCESS,'登录成功')

2017-09-24`
auth验证:
from django.contrib.auth import authenticate
from django.contrib import auth,messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
#在此只导入auth需要用到的模块,还有messages模块
#主页
@login_required(login_url='/login') #未登录则跳转
def index(request):
    if request.user.is_authenticated(): #判断是否登录
        message="登录成功<h3><a href='/logout'>注销</a></h3>"
    return HttpResponse(message)
#登录
def login(request):
    if request.method=='POST':
        login_form=forms.LoginForm(request.POST)
        if login_form.is_valid(): #若表单字段正确
            login_name=request.POST['username'].strip()
            login_password=request.POST['password']
            user=authenticate(username=login_name,password=login_password)
            if user is not None:  #若此账号与密码正确
                if user.is_active:  #若此账号已经启用
                    auth.login(request,user) #则写入session
                    print ("success") #成功
                    messages.add_message(request,messages.SUCCESS,'成功登录')
                    return HttpResponseRedirect('/index')
                else:
                    messages.add_message(request,messages.WARNING,'账号尚未启用')
            else:
                messages.add_message(request,messages.WARNING,'账号或密码不正确')
        else:
            messages.add_message(request,messages.INFO,'请确认输入的信息是否正确')
    else:
        login_form=forms.LoginForm()
    template=get_template('login.html')
    request_context=RequestContext(request)
    request_context.push(locals())
    html=template.render(request_context)
    return HttpResponse(html)
#注册
def zhuce(request):
    if request.method=='POST':
        form=forms.ZhuceForm(request.POST)
        if form.is_valid():
            name=request.POST['name']
            email=request.POST['email']
            pawd=request.POST['pawd']
            try:
                user=User.objects.create_user(name,email,pawd)
                user.save()
                messages.add_message(request,messages.SUCCESS,'注册成功')
                return HttpResponseRedirect('/login')
            except:
                messages.add_message(request,messages.WARNING,'注册失败')
        else:
            messages.add_message(request,messages.WARNING,'请确认输入正确')
    else:
        form=forms.ZhuceForm()
    template=get_template('zhuce.html')
    request_context=RequestContext(request)
    request_context.push(locals())
    html=template.render(request_context)
    return HttpResponse(html)
#注销
def logout(request):
    auth.logout(request)
    messages.add_message(request,messages.INFO,'注销成功')
    return HttpResponseRedirect('/login')

2017-09-24`
ModelForm窗体之日历:
from django import forms
class DateInput(forms.DateInput): #日期类
    input_type='date'

class PostForm(ModelForm):
    class Meta:
        model=models.Post
        fields=['name','pawd',ddate']
        widgets={
            'ddate':DateInput(), #调用日期类
        }
    def __init__(self,*args,**kwargs):
    super(UserForm,self).__init__(*args,**kwargs)
    self.fields['name'].label='账 号'
    self.fields['pawd'].label='密 码'
    self.fields['ddate'].label='日 期'#可用鼠标单击输入日期
    
2017-10-18`
django数据库操作
from mysite.models import User,BookInfo
一.查询:
0.查询函数的返回值:
get:对象; all/filter/exclude/order_by:QuerySet; aggregate:字典; count:数字
1.判等:
User.objects.get(name='Apress') #查找指定name,有且只能有一个结果,否则抛出异常
User.objects.filter(name='Apress') #查找指定name的数据信息
2.模糊查询:
User.objects.filter(name__contains='press') #包含pross,相当于(select...where name like '%press%')
BookInfo.objects.filter(btitle__startswith='天') #查询以'天'开头的图书,(endswith结尾)
3.空查询:
BookInfo.objects.filter(btitle__isnull=False) #查询书名不为空的图书
4.范围查询:
BookInfo.objects.filter(id_in=[1,3,9]) #查询id为1,3或5的图书
5.比较查询:
BookInfo.objects.filter(id__gte=3) #查询id大于等于3的,gt/lt/lte(大于/小于/小于等于)
6.日期查询:
BookInfo.objects.filter(pub_date__year=1980) #查询1980年发表的图书
BookInfo.objects.filter(pub_date__gt=date(1980,1,1)) #查询1980年1月1日后发表的图书
7.排序查询:
User.objects.order_by('name') #根据名字排序
User.objects.order_by('-name') #根据名字逆向排序
User.objects.filter(country='U.S.A').order_by('-name') #过滤指定信息并进行反排序
User.objects.order_by('name')[0:2] #根据名字排序,并取出前两个(不支持-1)
8.排除查询:
BookInfo.objects.exclude(id=3) #查询id不为3的图书
9.F对象:
from django.db.models import F  #使用前先导入
BookInfo.objects.filter(bread__gt=F('bcomment')) #查询阅读量大于评论量的图书
BookInfo.objects.filter(bread__gt=F('bcomment')*2) #查询阅读量大于2倍评论量的图书
10.Q对象:
from django.db.models import Q  #使用前先导入
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30) #查id>3,或阅读量>30的,(|/&/^)或/与/非;
11.聚合函数:
from django.db.models import Sum,Count,Max,Min,Avg
BookInfo.objects.aggregate(Sum('bread')) #查询所有图书阅读量总和,值:{'bread__sum':180}

二.增加
user=User.objects.get(name='Apress')
user.name='Appress Publishing'
user.save() #更改名称并保存
三.修改:
User.objects.filter(id=23).update(name='Tom') #修改指定id的名称
User.objects.all().update(country='USA') #修改所有字段
四.删除:
User.objects.filter(id=23).delete() #删除id=23的

2017-11-14`
#上传文件一:
一.(views.py)
def upload_file(request):
    if request.method == 'POST':
        myfile = request.FILES.get('myfile', None)#获取上传文件
        if myfile:
            destination = open(os.path.join('C:\\PythonFiles\\upload\\upload1', myfile.name), 'wb')
            for chunk in myfile.chunks(): #分块写入文件
                destination.write(chunk)
            destination.close()
            fileName=myfile.name #文件名xx.jpg
            size=myfile.size/1024 #大小KB
            return render(request,'upload_success.html',locals())
        else:
            return HttpResponse('no files for upload')
    else:
        return render(request, 'upload.html')
二.(upload.html)
<form action="/upload/" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="myfile" />
    <input type="submit" value="upload" />
</form>
三.(upload_success.html)
{% load staticfiles %}
<ul>
    <li>文件名:{{ fileName }}</li>
    <li>大小:{{ size }} KB</li>
    <li>文件:<img src="{% static fileName %}" width="100" height="80"/></li>
</ul>

#上传文件二:
一.(models.py)
from django.db import models
class User(models.Model):
    username=models.CharField(max_length=30) #文件名称
    headImg=models.FileField(upload_to='./upload/') #不加upload则存到项目目录
    def __unicode__(self):
        return self.username
二.(views.py)
from django.shortcuts import render,render_to_response
from django import forms
from django.http import HttpResponse
from .models import User
class UserForm(forms.Form):
    username=forms.CharField(label='姓名',max_length=30)
    headImg=forms.FileField(label='文件')

def register(request):
    if request.method=="POST":
        uf=UserForm(request.POST,request.FILES)
        if uf.is_valid():
            username=uf.cleaned_data['username']
            headImg=uf.cleaned_data['headImg']
            user=User()
            user.username=username
            user.headImg=headImg
            user.save()           
            return HttpResponse('upload ok')
        else:
            return HttpResponse('upload no')
    else:
        uf=UserForm()
        return render_to_response('register.html',{'uf':uf})
三.(upload.html)
<form method="POST" enctype="multipart/form-data" >
    {% csrf_token %}
    {{ uf.as_p }}
    <input type="submit" value="上传"/>
</form>

2017-11-17`
Django-Redis的使用
一.安装django-redis模块,已及redis服务器
二.(settings.py)配置:
CACHES={
  'default':{
    'BACKEND':'redis_cache.cache.RedisCache',
    'LOCATION':'127.0.0.1:6379',
    'OPTIONS':{'CLIENT_CLASS':'redis_cache.client.DefaultClient',},
    },
}
NEVER_REDIS_TIMEOUT=365*24*60*60 #此条可以省略
三.在项目中创建一个(redis.py)的工具模块:
from django.conf import settings
from django.core.cache import cache
import json
#从缓存读数据
def read_from_cache(self,user_name):
  key='user_id_of_'+user_name
  value=cache.get(key)
  if value==None:
    data=None
  else:
    data=json.loads(value)
  return data
#写数据到缓存
def write_to_cache(self,user_name):
  key='user_id_of_'+user_name
  cache.set(key,json.dumps(user_name),settings.NEVER_REDIS_TIMEOUT)

2017-11-18`
下载文件(以图片为例):
一.(views.py):
from django.http import StreamingHttpResponse
def down_file(request,file_name):
    def file_iterator(name,chunk_size=512):
        with open(name,'rb') as f:
            while True:
                c=f.read(chunk_size)
                if c:
                    yield c
                else:
                    break
    the_file_name=os.path.join('C:\\PythonFiles\\upload\\upload1',file_name)
    response=StreamingHttpResponse(file_iterator(the_file_name))
    response['Content-Type']='application/octet-stream'
    response['Content-Disposition']='attachment;filename="{0}"'.format(the_file_name)
    return response

def down(request):
    '''访问下载的网址,返回可下载的文件名列表'''
    file_name=[n for n in os.listdir('C:\\PythonFiles\\upload\\upload1') if n.endswith('.jpg')]
    return render(request,'down.html',{'file_name':file_name})
二.(urls.py):
url(r'^down/$',views.down),
url(r'^downs/(\w+\.jpg)/$',views.down_file),
三.(down.html):
{% for name in file_name %}
    <a href="/downs/{{name}}">{{name}}</a>
{% endfor %}

2017-11-18`
#Django model,QuerySet序列化成json:
from django.core import serializers
from mysite.models import Users
一.QuerySet类型:
data=serializers.serialize('json',Users.objects.all())
ata1=serializers.serialize('json',Users.objects.filter(id=1))
二.Users实例类型:
#在Users类添加如下方法:
def toJSON(self):
        import json
        return json.dumps(dict([(attr,getattr(self,attr)) for attr in [f.name for f in self._meta.fields]]))

#要序列化时这样操作:
row=Users.objects.get(id=1)
row.toJSON()

2017-11-22`
django-admin:
python manage.py 常用命令:
runserver 8080 #更改服务器端口号
shell #启动交互页面
startapp app #创建一个app
syncdb #运行SQL语句,创建模型相应的Table
dbshell #启动数据库的命令行
sqlall app #查看这个app下的所有表
validate #验证模型是否配置有误

#django ModelAdmin举例:
class ArticleAdmin(admin.ModelAdmin):

  list_display=('title','pub_date','update_time')

  search_fields=('title','content') #按照标题或内容搜索

  #list_filter=('status') #根据文章的状态筛选


2017-11-25`
#请求:
name=request.GET['name'] #GET请求,获得提交的name数据
name=request.GET.get('name')
name=request.POST['name'] #POST请求,获得提交的name数据
name=request.POST.get('name')
name=request.REQUEST.get('name') #获得(POST,GET)提交的name

# with在模板标签中赋值
{% with age=89 %}
年龄:{{ age | add:9}} #加9,输出值:98
{% endwith %}

2017-11-25`
一.模型类关系:
1)一对多: 图书类--英雄类
models.ForeignKey()       #定义在多的类中
2)多对多: 新闻类--新闻类型类
models.ManyToManyField()  #定义在哪个类中都可以
3)一对一: 员工基本信息类--员工详细信息类
models.OneToOneField()    #定义在哪个类中都可以

二.关联查询(一对多)
1)通过对象执行关联查询:
#查询图书id为1的所有英雄信息
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()

#查询英雄id为1的所属图书信息
h=HeroInfo.objects.get(id=1)
h.hbook
h.hbook_id

2)通过模型类实现关联查询:
#查询图书,要求图书中英雄的描述包含'八'
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
#查询图书,要求图书中的英雄id大于3
BookInfo.objects.filter(heroinfo__id__gt=3)
#查询英雄,要求书名为'天龙八部'
HeroInfo.objects.filter(hbook__btitle='天龙八部'

2017-12-07`
#在页面显示csv文件与pdf文件
import csv
from django.http import HttpResponse

def some_view(request): #CSV
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
    writer = csv.writer(response)
    writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
    writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])
    return response

from reportlab.pdfgen import canvas

def some_view(request): #PDF
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'
    p = canvas.Canvas(response)
    p.drawString(100, 100, "Hello world.")
    p.showPage()
    p.save()
    return response

2017-12-09`
#在网页标题前显示图标:
<head>
<link rel="icon" href="picture.ico" type="image/x-icon"/>  
</head>

2017-12-10`
Django部署到nginx
一、nginx.conf配置:
worker_processes  1;
events {
    worker_connections  64;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        root   C:/djpy/yiran_house;  #项目路径     
        index  index.html index.htm;
        charset utf-8;       
        location /media{
                alias   /cygdrive/C:/djpy/yiran_house/statics;
        }
        # 静态资源
        location ~ .*.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$
        {
                expires 30d;
                break;
        }
        location / {
            # 指定 fastcgi 的主机和端口
            fastcgi_pass 127.0.0.1:8051;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            fastcgi_param REQUEST_METHOD $request_method;
            fastcgi_param QUERY_STRING $query_string;
            fastcgi_param CONTENT_TYPE $content_type;
            fastcgi_param CONTENT_LENGTH $content_length;
            fastcgi_param SERVER_PROTOCOL $server_protocol;
            fastcgi_param SERVER_PORT $server_port;
            fastcgi_param SERVER_NAME $server_name;
            fastcgi_pass_header Authorization;
            fastcgi_intercept_errors off;
        }       
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }        
    }
}
二、settings.py配置(可选):
DEBUG = False
ALLOWED_HOSTS = ["*"]
STATIC_ROOT='C:/djpy/yiran_house/statics'
三、启动:
(1)运行nginx.exe
(2)python manage.py runfcgi host=127.0.0.1 port=8051 protocol=fcgi method=threaded


猜你喜欢

转载自blog.csdn.net/a649344475/article/details/80823748