view
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
class AjaxForm(forms.Form):
username=fields.CharField()#静态字段,当程序运行起来时就执行了,并且执行后就不变化了,数据源更新但是不会在数据源取数据
user_id=fields.IntegerField(
# widget=widgets.Select(choices=[(0,'alex'),(1,'liu'),(3,'li')]),
# widget=widgets.Select(choices=models.UserInfo.objects.values_list('id','username'))#第一次永远用不上
widget=widgets.Select(choices=[(1, '刚娘',), (2, '铁娘'), (3, '钢弹') ])
)
# 这里面的clean方法是在是在执行is_valid的时候才会执行
def clean_username(self):
v=self.cleaned_data['username']#用户提交过来的用户名
if models.UserInfo.objects.filter(username=v).count():# 数据库比对
# 整体错了,自己详细错误信息也要有
raise ValidationError('用户名已经存在')
return v#否则返回就行
def clean_user_id(self):
return self.cleaned_data['user_id']
def ajax(request):
if request.method=='GET':
obj=AjaxForm()
return render(request,'ajax.html',{'obj':obj})
else:
ret={'status':'杨建','message':None}
import json
obj=AjaxForm(request.POST)
if obj.is_valid():#obj.is_valid()做的验证
print(obj.cleaned_data)
# 跳转到百度
# return redirect('http://www.baidu.com')#这种直接跳转的方式用在ajax上没有用处
ret['status']='钱'
return HttpResponse(json.dumps(ret))
else:
# print(obj.errors)
print(type(obj.errors))
from django.forms.utils import ErrorDict#继承了字典的方式,所以json能够取到
# print(obj.errors.as_ul())#把错误转换成不同的类型,这里面默认是ul方式源码可见
# print(obj.errors.as_json())
# print(obj.errors.as_data())
ret['message']=obj.errors#这里类型是ErrorDict继承dict所以可以转化
return HttpResponse(json.dumps(ret))
# 错误信息显示在页面上
# django数据库扩展
# 在full_clean方法中将错误信息赋值为空