djangomodelform操作及验证ajax操作文件上传
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了djangomodelform操作及验证ajax操作文件上传相关的知识,希望对你有一定的参考价值。
一、modelForm操作及验证
1.获取数据库数据,界面展示数据并且获取前端提交的数据,并动态显示select框中的数据
views.py
from django.shortcuts import render,HttpResponse from app01 import models from django import forms from django.forms import fields as Ffields from django.forms import widgets as Fwidgets class UserInfoModelForm(forms.ModelForm): class Meta:#必须添加 model = models.UserInfo#指定去UserInfo表里获取数据 fields = ‘__all__‘ #在界面显示所有字段 # fields = [‘username‘,‘email‘]#只在界面显示‘username‘,‘email‘字段 # exclude = [‘username‘] #不在界面显示‘username‘字段 class UserInfoForm(forms.Form): username = Ffields.CharField(max_length=32) email = Ffields.EmailField() user_type = Ffields.ChoiceField( choices=models.UserType.objects.values_list(‘id‘,‘caption‘)#以‘id‘,‘caption‘为select框中的数据 ) def __init__(self, *args, **kwargs): super(UserInfoForm,self).__init__(*args, **kwargs) self.fields[‘user_type‘].choices = models.UserType.objects.values_list(‘id‘,‘caption‘)#加上这个init函数 #后,就能将新添加到数据库中的数据动态显示到select框啦 def index(request): if request.method == "GET":#将数据展示在界面 obj = UserInfoModelForm() return render(request,‘index.html‘,{‘obj‘: obj}) elif request.method == "POST":#获取前端提交的数据 obj = UserInfoModelForm(request.POST) if obj.is_valid():#obj.is_valid()只能为true或false print(obj.is_valid()) print(obj.cleaned_data) #obj.cleaned_data以字典的形式展示前端提交的数据 print(obj.errors.as_json())#打印错误信息 return render(request,‘index.html‘,{‘obj‘: obj})
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/index/" method="POST"> {% csrf_token %} {{ obj.as_p }} #以p标签的形式展示数据 <input type="submit" value="提交" /> </form> </body> </html>
二、完整的在界面展示数据、修改数据、提交数据、跳转到新页面
views.py
from django.shortcuts import render,HttpResponse from app01 import models from django import forms from django.forms import fields as Ffields#给导入的fields设置别名为Ffields from django.forms import widgets as Fwidgets#给导入的widgets设置别名为Fwidgets class UserInfoModelForm(forms.ModelForm): is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput())#自定义在界面显示的单选框等,而且不用保存在数据库 class Meta:#class Meta里一定不要加逗号 model = models.UserInfo#指定去UserInfo表里获取数据 fields = ‘__all__‘ #在界面显示所有字段 # fields = [‘username‘,‘email‘]#只在界面显示‘username‘,‘email‘字段 # exclude = [‘username‘] #不在界面显示‘username‘字段 labels = {#设定输入框的标签名 ‘username‘: ‘用户名‘, ‘email‘: ‘邮箱‘, } help_texts = {#在输入框后面自定义帮助信息 ‘username‘: ‘我是帮助信息‘ } widgets = {#自定义输入框的属性,即自定义html标签的class ‘username‘: Fwidgets.Textarea(attrs={‘class‘: ‘c1‘})#将输入框设置为text文本框,并添加css:‘c1’ } error_messages = {#自定义错误信息提示 ‘__all__‘:{#给整体设置错误信息,跟form中的all一样 }, ‘email‘: {#给每个字段设定错误信息 ‘required‘: ‘邮箱不能为空‘, ‘invalid‘: ‘邮箱格式错误..‘, } } field_classes = {#将email输入框的格式验证修改为必须输入URL格式才正确 # ‘email‘: Ffields.URLField } localized_fields=(‘ctime‘,)#将数据库时间转化为北京时间,括号里写需要转化时间的字段,需要在settings里设置 #timezone class UserInfoForm(forms.Form): username = Ffields.CharField(max_length=32) email = Ffields.EmailField() user_type = Ffields.ChoiceField( choices=models.UserType.objects.values_list(‘id‘,‘caption‘)#以‘id‘,‘caption‘为select框中的数据 ) def __init__(self, *args, **kwargs): super(UserInfoForm,self).__init__(*args, **kwargs) self.fields[‘user_type‘].choices = models.UserType.objects.values_list(‘id‘,‘caption‘)#加上这个init函数 #后,就能将新添加到数据库中的数据动态显示到select框啦 def index(request):#将数据展示在界面 if request.method == "GET": obj = UserInfoModelForm() return render(request,‘index.html‘,{‘obj‘: obj}) elif request.method == "POST": obj = UserInfoModelForm(request.POST) if obj.is_valid():#obj.is_valid()只能为true或false obj.save()#自动将前端提交的数据保存在数据库 # print(obj.cleaned_data) #obj.cleaned_data以字典的形式获取前端提交的数据 # print(obj.errors.as_json()) return render(request,‘index.html‘,{‘obj‘: obj}) def user_list(request): li = models.UserInfo.objects.all().select_related(‘user_type‘)#获取UserInfo表中的所有数据,并且跨表将与UserInfo # 关联的user_type表中的数据也取出来,注意括号中写UserInfo类中的关联字段名,不可以写多对多的字段名,否则报错, #前端html跨表取user_type表数据:{% for row in li %} {{ row.user_type.caption }} return render(request,‘user_list.html‘,{‘li‘: li}) def user_edit(request, nid): # 1.获取当前id对应的用户信息 # 2.显示用户已经存在数据 if request.method == "GET":#数据展示 user_obj = models.UserInfo.objects.filter(id=nid).first()#根据nid获取UserInfo表中的相关数据的第一条 mf = UserInfoModelForm(instance=user_obj)#将mf传到前端就可以自动生成网页,括号中的instance参数是显示默认值 return render(request,‘user_edit.html‘,{‘mf‘: mf, ‘nid‘: nid})#跳转回本页面,也可以跳转到其他页面 elif request.method == ‘POST‘:#数据修改 user_obj = models.UserInfo.objects.filter(id=nid).first() mf = UserInfoModelForm(request.POST,instance=user_obj)#如果不加这句,就会自动在数据库中新添加数据,而不是修改 #已存在的数据 if mf.is_valid(): mf.save()#将修改的数据写入到数据库中 else:#如果出现异常,打印错误信息 print(mf.errors.as_json()) return render(request,‘user_edit.html‘,{‘mf‘: mf, ‘nid‘: nid})
urls.py
url(r‘^admin/‘, admin.site.urls), url(r‘^index/‘, views.index), url(r‘^user_list/‘, views.user_list), url(r‘^edit-(\\d+)/‘, views.user_edit),
index.html
同上
user_list.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <ul> {% for row in li %} <li>{{ row.username }} - {{ row.user_type.caption }} - <a href="/edit-{{ row.id }}/">编辑</a></li> {% endfor %} </ul> </body> </html>
user_edit.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form method="POST" action="/edit-{{ nid }}/"> #以新链接的形式提交数据 {% csrf_token %} {{ mf.as_p }} <input type="submit" value="提交" /> </form> </body> </html>
以上是关于djangomodelform操作及验证ajax操作文件上传的主要内容,如果未能解决你的问题,请参考以下文章