zoukankan      html  css  js  c++  java
  • Python学习day12 Django

    Created on 2017年4月18日

    第一课

     

    第4课 上节内容回顾 16minutes

    MTV/MVC
    路由系统 URL
    Model
    模板系统 Sampletags

    Django流程图

    client-->Django服务器程序--->走路由系统--->交由Views各模块处理--->调用数据库
    --->返回给前端Web页面


    第5课 Model连表操作一 56minutes

    UserInfo.objects.all() 所有数据(序列)
    UserInfo.objects.get() 一条数据
    UserInfo.objects.filter(id__gt=5) 取id大于5的记录
    UserInfo.objects.filter(id__lt=5) 取ii小于5的记录


    连表操作(一对多查询)

    class UserType(models.Model):
    name = models.CharField(max_length=50)
    +----+------------+
    | id | name |
    +----+------------+
    | 1 | User |
    | 2 | Admin |
    | 3 | Spueradmin |
    +----+------------+
    3 rows in set (0.00 sec)

    class UserInfo(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    email = models.EmailField()
    user_type = models.ForeignKey('UserType')--封装一个对象,user_type就是UserType

    +----+----------+----------+---------------+--------------+
    | id | username | password | email | user_type_id |
    +----+----------+----------+---------------+--------------+
    | 1 | allan | 111111 | allan@163.com | 2 |
    | 2 | lily | 111111 | lily@163.com | 1 |
    | 3 | alex | 111 | alex@2.com | 3 |
    +----+----------+----------+---------------+--------------+
    3 rows in set (0.00 sec)


    联表操作,取值用.点, 查询用__双下划线

    查询所有TypeID大于0的所有用户信息
    UserInfo.objects.filter(user_type__id__gt=0)

    查询Type类型为Supername的用户信息,只显示用户名
    UserInfo.objects.filter(user_type__name='Superadmin').values('username')




    连表操作(多对多查询)
    多对多,会自动产生第三张表

    class UserInfo1(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    email = models.EmailField()

    class UserGroup(models.Model):
    GroupName = models.CharField(max_length=50)
    user = models.ManyToManyField('UserInfo1')

    mysql> select * from app01_usergroup;
    +----+-----------+
    | id | GroupName |
    +----+-----------+
    | 1 | alarm |
    | 2 | monitor |
    | 3 | db |
    +----+-----------+
    3 rows in set (0.00 sec)

    mysql> select * from app01_userinfo1;
    +----+----------+----------+---------------+
    | id | username | password | email |
    +----+----------+----------+---------------+
    | 1 | alan | 111111 | asd@af.com |
    | 2 | alex | 111111 | skdf@asf.adsf |
    | 3 | dd | sdfkasf | asd@a.sdf |
    | 4 | sdfa | gasg | sdf@@sd.csdf |
    +----+----------+----------+---------------+
    4 rows in set (0.00 sec)


    会自动创建一个关系对应表:
    mysql> desc app01_usergroup_user;
    +--------------+---------+------+-----+---------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +--------------+---------+------+-----+---------+----------------+
    | id | int(11) | NO | PRI | NULL | auto_increment |
    | usergroup_id | int(11) | NO | MUL | NULL | |
    | userinfo1_id | int(11) | NO | MUL | NULL | |
    +--------------+---------+------+-----+---------+----------------+
    3 rows in set (0.01 sec)

    u1 = UserInfo1.objects.get(id=1)
    g1 = UserGroup.objects.get(id=1)
    g1.user.add(u1)


    第6课 Model连表操作二 5minutes


    ManyToMany在哪张表里面,就直接在表里直接用user.add来添加一条对应关系
    g1.user.add(u1)-----user是其中的字段

    同时可用另一张表创建:

    u1.usergroup_set.add(g2)----usergropu是另一张表名

    添加------------------------------------
    u1 = UserInfo1.objects.get(id=1)
    uall = UserInfo1.objects.all()

    g1 = UserGroup.objects.get(id=1)

    g1.user.add(u1)
    g1.user.add(*uall)-----添加所有时,需要在前加*

    u1.usergroup_set.add(g1)
    u1.usergroup_set.add(*gall)


    删除------------------------------------
    g1.user.remove(u1)
    g1.user.remove(*uall)----删除所有时,也要加*

    u1.usergroup_set.remove(g1)
    u1.usergroup_set.remove(*gall)

    获取数据

    g1.user.all()----得到组的记录 得到是UserInfo1的表信息
    g1.user.all().filter(id=3)

    以下是得到组的表信息
    u2.usergroup_set.all() 获取一条数据,如果u2在关系表里没有数据,返回空
    u2.usergroup_set.all().filter(GroupName='alarm')


    第7课 Form创建Html和验证输入 36minutes

    为什么要写Form
    from django import forms

    class LoginForm(forms.Form):
    username = forms.CharField()
    email = forms.EmailField(required=True)
    ipaddr = forms.GenericIPAddressField()

    def login(request):
    formobj =LoginForm()
    if request.method == 'POST':
    print request.POST
    form = LoginForm(request.POST) #这里要用原生的Form,不能用上面的Formobj
    if form.is_valid():
    pass
    else:
    #这里就是将后台的错误信息生成一个对象,这个对象里有很多的方法,可通过errors查看
    er = form.errors
    #可通打印这个对象来确认对象名称,
    print type(form.errors)

    #再通过这个对象名称找到对应的Error信息
    django.forms.utils.ErrorDict---这个不应该写要代码里,是打印出来的对象,用于查找Error信息的

    return render_to_response('login.html', {'data':formobj,'er':er})

    这是查到的Error类
    class ErrorDict(dict):
    def as_data(self):
    return {f: e.as_data() for f, e in self.items()}

    def as_json(self, escape_html=False):
    return json.dumps({f: e.get_json_data(escape_html) for f, e in self.items()})

    def as_ul(self):
    if not self:
    return ''
    return format_html(
    '<ul class="errorlist">{}</ul>',
    format_html_join('', '<li>{}{}</li>', ((k, force_text(v)) for k, v in self.items()))
    )

    def as_text(self):
    output = []
    for field, errors in self.items():
    output.append('* %s' % field)
    output.append('\n'.join(' * %s' % e for e in errors))
    return '\n'.join(output)

    def __str__(self):


    前端接收er的参数,并对参数调整,可沿用上面的相关方法
    {{er.as_ul}}



    第8课 Form创建自定义错误信息一 13minutes

    def login(request):
    '''
    这是有个思路:可以先设定一个字典,此字典用于后面返回给前端页面
    字典有两个参数,数据和错误,将Form封装到数据中,将错误封装到错误中
    同时在输入出现错误的时候,将数据变成已接收到的数据,这样前端页面
    输入的数据不会消失,否则错误产生则需要重新输入
    '''
    ret = {'formobj':None,'error':''}
    formobj =LoginForm()
    ret['formobj']=formobj
    if request.method == 'POST':
    #print request.POST
    form = LoginForm(request.POST) #这里要用原生的Form,不能用上面的Formobj
    if form.is_valid():
    pass
    else:
    #这里就是将后台的错误信息生成一个对象,这个对象里有很多的方法,可通过errors查看
    #er = form.errors
    #可通打印这个对象来确认对象名称,
    #print type(form.errors)
    #再通过这个对象名称找到对应的Error信息
    #django.forms.utils.ErrorDict
    #print form.errors.as_data().values()[0][0][0].message 不加message是一个对象
    error = form.errors.as_data().values()[0][0].message
    ret['error']=error
    ret['formobj']=form

    return render_to_response('login.html', ret)


    自定义错误
    class LoginForm(forms.Form):
    #error_messages用这个自定义提示错误
    username = forms.CharField(error_messages={'required':u'用户名不能为空','invalid':'用户名格式错误'})
    email = forms.EmailField(required=True,error_messages={'required':u'用户名不能为空','invalid':'用户名格式错误'})
    ipaddr = forms.GenericIPAddressField(error_messages={'required':u'IP不能为空','invalid':'IP地址错误'})


    第9课 Form创建自定义错误信息二 10minutes

    ModelForm 自己练习

    设置表格的样式
    class LoginForm(forms.Form):
    #error_messages用这个自定义提示错误
    username = forms.CharField(error_messages={'required':u'用户名不能为空','invalid':'用户名格式错误'})
    email = forms.EmailField(required=True,error_messages={'required':u'邮箱不能为空','invalid':'邮箱格式错误'})
    ipaddr = forms.GenericIPAddressField(error_messages={'required':u'IP不能为空','invalid':'IP地址错误'})
    #可用以下方式设置Form的格式,这是其一
    #email = forms.CharField(widget=forms.EmailInput(attrs={'css':'sdfa'})

    #设置方法其二
    def __init__(self):
    self.fields['email'].widget_attrs()----这里有错误,待查老男孩的博客确认


    Created on 2017年4月19日
    第10课 Ajax使用一 22minutes

    Ajax 用于页面局部刷新
    <input id='a' type='text'/>
    <input type='button' value='ajax请求' onclick='DoAjax()'/>


    <script src='jquery-1.12.4.js'></script>
    <script type='text/javascript'>
    function DoAjax(){
    //var id = document.getElementById('name')
    var a1 = $("#a");
    var temp = $("#a").val();
    console.log(a1);
    $.ajax({
    url:'/app01/ajax/',
    type:'POST',
    data:{dat:temp},
    success:function(arg){
    console.log('success');
    },
    error:function(){
    console.log('failed');
    }
    });
    }
    </script>

    这个没有测试成功,页面始终出现错误
    Uncaught ReferenceError: $ is not defined
    问题找到了,原来是Jquery引用问题,直接用绝对路径就可以
    <script src='/static/jquery/jquery-1.8.0.js'></script>


    第11课 Ajax使用 二 10minutes

    -----------------后台--------------------------------
    def ajax(request):
    if request.method == 'POST':
    print request.POST
    #这里可以自定义信息,以一个字典的方式,通过json传递到前端
    #前端通过Jquery的
    data = {'status':0,'msg':'请求成功','data':[11,22,33,44,55]}
    return HttpResponse(json.dumps(data))
    else:
    return render_to_response('ajax.html')


    -----------------前台--------------------------------
    <script src='jquery-1.12.4.js'></script>
    <script type='text/javascript'>
    function DoAjax(){
    //var id = document.getElementById('name')
    //var a1 = $("#a");
    var temp = $("#na").val();
    console.log(temp);
    $.ajax({
    url:'/app01/ajax/',
    type:'POST',
    data:{dat:temp},
    success:function(arg){
    //用jQuery.parseJSON解析后台送过来的Json数据
    var obj = jQuery.parseJSON(arg);
    console.log(obj.status);
    console.log(obj.msg);
    console.log(obj.data);
    console.log('success');
    //再将数据返回到页面中
    $('#na').val(arg)
    },
    error:function(){
    console.log('failed');
    }
    });
    }
    </script>

    ----------9/10两课Ajax未测试成功,需重新学习--------------



    第12课 本节作业 9minutes
    作业:完善主机管理系统
    1.一对多,多对多表查询操作
    2.主机管理基础上完上用户类型管理、用户管理、用户组管理
    3.Form实现登录、注册:注册时验证用户名是否存在:
    在离开用户名框时,用onblur事件检查用户名是否存在)




  • 相关阅读:
    Python正则表达式很难?一篇文章搞定他,不是我吹!
    该用Python还是SQL?4个案例教你节省时间
    解决mysql中只能通过localhost访问不能通过ip访问的问题
    MySql按周/月/日分组统计数据的方法
    jquery清空form表单
    eclipse 创建 maven web工程
    微信授权登录
    bootstrap滑动开关插件使用
    去除编译警告@SuppressWarnings注解用法详解(转)
    dataTables添加序号和行选中框
  • 原文地址:https://www.cnblogs.com/syother/p/6737168.html
Copyright © 2011-2022 走看看