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事件检查用户名是否存在)




原文地址:https://www.cnblogs.com/syother/p/6737168.html