django进阶

查表操作
# 获取个数 # # models.Tb1.objects.filter(name='seven').count() # 大于,小于 # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值 # models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值 # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值 # models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 # in # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # contains # # models.Tb1.objects.filter(name__contains="ven") # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 # models.Tb1.objects.exclude(name__icontains="ven") # range # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and # order by # # models.Tb1.objects.filter(name='seven').order_by('id') # asc # models.Tb1.objects.filter(name='seven').order_by('-id') # desc

  

其他操作
# F
    #
    # from django.db.models import F
    # models.Tb1.objects.update(num=F('num')+1)
    # Q
    #
    # 方式一:
    # Q(nid__gt=10)
    # Q(nid=8) | Q(nid__gt=10)
    # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
    # 方式二:
    # con = Q()
    # q1 = Q()
    # q1.connector = 'OR'
    # q1.children.append(('id', 1))
    # q1.children.append(('id', 10))
    # q1.children.append(('id', 9))
    # q2 = Q()
    # q2.connector = 'OR'
    # q2.children.append(('c1', 1))
    # q2.children.append(('c1', 10))
    # q2.children.append(('c1', 9))
    # con.add(q1, 'AND')
    # con.add(q2, 'AND')
    #
    # models.Tb1.objects.filter(con)

  跨表

自制分页

 

 

class Pageinfo(object):
    def __init__(self,current_page,all_page,page,show_page,base_url):
        try:
            self.current_page=int(current_page)
        except Exception as e:
            self.current_page=1
        self.page = page
        a,b=divmod(all_page,page)
        if b:
            a=a+1
        self.all_page=a
        self.show_page=show_page
        self.base_url=base_url
    def start(self):
        return (self.current_page-1)*self.page
    def end(self):
        return self.current_page  * self.page

    def page1(self):
        # v = '<a href="/app01/index.html?page=1">1</a>'
        # return v
        list = []
        if self.current_page<=1:
            prev = '<li><a href="#">上一页</a></li>'
        else:
            prev='<li><a href="%s?page=%s">上一页</a></li>'%(self.base_url,self.current_page-1)
        list.append(prev)
        half = int((self.show_page-1)/2)
        if self.all_page<self.show_page:
            begin=1
            stop=self.all_page+1
        else:
            if self.current_page <= half:
                begin = 1
                stop = self.show_page+1
            else:
                if self.current_page+half>self.all_page:
                    begin=self.all_page-self.show_page
                    stop = self.all_page+1
                else:
                    begin=self.current_page-half
                    stop=self.current_page+half+1
        for i in range(begin,stop):
            if i ==self.current_page:
                v = '<li class="active"><a href="%s?page=%s">%s</a></li>'%(self.base_url,i,i)
            else:
                v = '<li><a href="%s?page=%s">%s</a></li>'%(self.base_url,i,i)
            list.append(v)
        if self.current_page>=self.all_page:
            prev = '<li><a href="#">下一页</a>'
        else:
            prev='<li><a href="%s?page=%s">下一页</a></li>'%(self.base_url,self.current_page+1)
        list.append(prev)
        return ''.join(list)
def index(request):
    all_page = models.index.objects.all().count()
    current_page=request.GET.get('page')
    pageinfo=Pageinfo(current_page,all_page,10,7,'/app01/index.html')
    group_list = models.index.objects.all()[pageinfo.start():pageinfo.end()]
    return render(request, 'index.html', {"group_list": group_list,"pageinfo":pageinfo})
分页view
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<table class="table table-bordered table table-hover">
<h1>分页模板</h1>
    <thead>
    <th>id</th>
        <th>班级</th>

    </thead>
    <tbody>
    {% for row in group_list %}
    <tr>
    <td>{{ row.id }}</td>
    <td>{{ row.title }}</td>

    </tr>
    {% endfor %}
    </tbody>
</table>

<nav aria-label="Page navigation">
  <ul class="pagination">
      {{ pageinfo.page1 |safe  }}

  </ul>
</nav>
</body>
</html>
分页html

session

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
 
a. 配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
     
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
 
 
 
b. 使用
 
    def index(request):
        # 获取、设置、删除Session中数据
        request.session['k1']
        request.session.get('k1',None)
        request.session['k1'] = 123
        request.session.setdefault('k1',123) # 存在则不设置
        del request.session['k1']
 
        # 所有 键、值、键值对
        request.session.keys()
        request.session.values()
        request.session.items()
        request.session.iterkeys()
        request.session.itervalues()
        request.session.iteritems()
 
 
        # 用户session的随机字符串
        request.session.session_key
 
        # 将所有Session失效日期小于当前日期的数据删除
        request.session.clear_expired()
 
        # 检查 用户session的随机字符串 在数据库中是否
        request.session.exists("session_key")
 
        # 删除当前用户的所有Session数据
        request.session.delete("session_key")
 
        request.session.set_expiry(value)
            * 如果value是个整数,session会在些秒数后失效。
            * 如果value是个datatime或timedelta,session就会在这个时间后失效。
            * 如果value是0,用户关闭浏览器session就会失效。
            * 如果value是None,session会依赖全局session失效策略。
数据库session
a. 配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
 
 
    SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/"                                # Session的cookie保存的路径
    SESSION_COOKIE_DOMAIN = None                              # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False                             # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次请求都保存Session,默认修改之后才保存
 
 
 
b. 使用
 
    同上
缓存session

自定义simple_tag

a、在app中创建templatetags模块

b、创建任意 .py 文件,如:xx.py

from django import template
from django.utils.safestring import mark_safe
   
register = template.Library()
   
@register.simple_tag
def my_simple_time(v1,v2,v3):
    return  v1 + v2 + v3
   
@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)

  c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名

{% load xx %}

  d、使用simple_tag

{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}

  随机字符串+ajax

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="/csrf.html/">
    {% csrf_token %}
    <input type="text" name="user" id="user">
    <input type="submit" value="提交">
    <input type="button" onclick="send();" value="ajax提交">
</form>
<script src="/static/jquery-3.3.1.js">
</script>
<script>
    function send() {
        var csrf=$('input[name="csrfmiddlewaretoken"]').val()
        var user=$("#user").val()
        $.ajax({
            url:'/csrf.html/',
            type:"POST",
            data:{'user':user,'csrfmiddlewaretoken':csrf},
            success:function (arg) {
                console.log(arg)

            }

        })

    }
</script>
</body>
</html>
csrf

Form

django中的Form一般有两种功能:

  • 输入html
  • 验证用户输入
import re
from django import forms
from django.core.exceptions import ValidationError


def mobile_validate(value):
    mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
    if not mobile_re.match(value):
        raise ValidationError('手机号码格式错误')


class PublishForm(forms.Form):

    user_type_choice = (
        (0, u'普通用户'),
        (1, u'高级用户'),
    )

    user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
                                                                  attrs={'class': "form-control"}))

    title = forms.CharField(max_length=20,
                            min_length=5,
                            error_messages={'required': u'标题不能为空',
                                            'min_length': u'标题最少为5个字符',
                                            'max_length': u'标题最多为20个字符'},
                            widget=forms.TextInput(attrs={'class': "form-control",
                                                          'placeholder': u'标题5-20个字符'}))

    memo = forms.CharField(required=False,
                           max_length=256,
                           widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3}))

    phone = forms.CharField(validators=[mobile_validate, ],
                            error_messages={'required': u'手机不能为空'},
                            widget=forms.TextInput(attrs={'class': "form-control",
                                                          'placeholder': u'手机号码'}))

    email = forms.EmailField(required=False,
                            error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
                            widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
Form
def publish(request):
    ret = {'status': False, 'data': '', 'error': '', 'summary': ''}
    if request.method == 'POST':
        request_form = PublishForm(request.POST)
        if request_form.is_valid():
            request_dict = request_form.clean()
            print request_dict
            ret['status'] = True
        else:
            error_msg = request_form.errors.as_json()
            ret['error'] = json.loads(error_msg)
    return HttpResponse(json.dumps(ret))
View

 

posted @ 2019-04-21 20:47  pypypy  阅读(363)  评论(0编辑  收藏  举报