Django保证表单的正确显示需要添加CSRF(防止网站跨站请求伪造而默认开启的一种保护方式),在
之间添加{% csrf_token %}
在项目settings.py中 * ‘django.middleware.csrf.CsrfViewMiddleware’, * 引入,如果没有此中间件,手动添加。
首次打开路径是GET请求,如果点击上传是POST请求,如果文件内容不为空,则上传文件,上传路径为主项目下的 media/uploads/,如果路径不存在则新建。open(os.path.join(path + myFile.name), ‘wb+’) 二进制读写打开对应文件,chunks()将文件分块读写。
def upload_file(request):
if request.method == "GET":
return render(request, 'app1/upload.html')
if request.method == "POST":
myFile = request.FILES.get("myfile", None)
if myFile:
path = 'media/uploads/'
if not os.path.exists(path):
os.makedirs(path)
dest = open(os.path.join(path + myFile.name), 'wb+')
for chunk in myFile.chunks():
dest.write(chunk)
dest.close()
return HttpResponse("上传完成")
else:
return HttpResponse("没有上传文件")
添加路由。
文件已经上传成功。
如下新建一个form.py写入如下代码
from django import forms
class UserInfoForm(forms.Form):
'''用户状态'''
STATUS = ((None, '请选择'), (0, '正常'), (1, '无效'),)
username = forms.CharField(label="用户名称", min_length=6, widget=forms.widgets.TextInput(
attrs={'class': 'form-control', 'placeholder': '请输入用户名称'}
))
password = forms.CharField(label="密码", min_length=6, max_length=10, widget=forms.widgets.PasswordInput(
attrs={'class': 'password'}, render_value=True
))
age = forms.IntegerField(label="年龄", initial=1)
mobile = forms.IntegerField(label="手机号码")
status = forms.ChoiceField(label="用户状态", choices=STATUS)
createdate = forms.DateTimeField(label="创建时间", required=False)
表单字段
| 表单字段 | 说明 |
|---|---|
| CharField | 文本输入 |
| InterField/FloatField/DecimalField | 数值输入 |
| ChoiceField | 选择输入框 choices指定下拉列表 |
| FileField | 文件 |
| BooleanField | 复选框 |
| DateField/DateTimeField/TimeField/时间输入框,可以设置输入格式 input_format=[“%Y-%m-%d %H:%M”] | |
| EmailField | 邮件输入框 |
| URLField | 路劲输入框 |
| ModelChoiceField | 从数据库获取下拉列表 |
| 字段 | 说明 |
|---|---|
| label | label标签 |
| label_suffix | Label标签统一后缀信息 |
| initial | 初始值 |
| help_text | 字段描述信息 |
| error_messages | 字段描述信息 |
| validators | 验证规则 |
| required | 是否必须 |
| disabled | 字段是否可编辑 |
| widget | 指定HTML样式 |
| 参数 | 说明 |
|---|---|
| PasswordInput | 密码输入框 |
| HiddenInput | 隐藏元素 |
| Textarea | 文本域 |
| CheckboxInput | 复选框 |
| FileInput | 文件输入框 |
| RadioSelect | 单选按钮 |
| DateTimeInput | 时间输入框 |
| Select | 下拉列表 |
| SelectMuitiple | 多选框 |
配置视图和路径显示对应表单
app1下的views.py
def userinfo_form(request):
if request.method == "GET":
myForm = UserInfoForm()
return render(request, 'app1/userinfo.html', {'form_obj': myForm})
userinfo.html
- as_p 为表单提供
标签
- as_table 为表单提供
标签
- as_ui 为表单提供
表单的验证标签
以上用了as_p,故源代码显示p标签。
- is_valid() 验证表单数据是否合法
- cleaned_data 获取表单通过验证的数据
- errors 表单验证的错误信息
在form中添加如下代码
class UserInfoForm__Msg(forms.Form): '''用户状态''' STATUS = ((None, '请选择'), (0, '正常'), (1, '无效'),) username = forms.CharField(label="用户名称", min_length=6, widget=forms.widgets.TextInput( attrs={'class': 'form-control', 'placeholder': '请输入用户名称'} ), error_messages={ 'required': '用户姓名不能为空', 'min_length': '长度不能少于6位', 'invalid': '不能含有特殊字符' }) password = forms.CharField(label="密码", min_length=6, max_length=10, widget=forms.widgets.PasswordInput( attrs={'class': 'password'}, render_value=True ), error_messages={ 'required': '密码不能为空', 'min_length': '密码不能少于6位', 'max_length': '密码不能多余10位', }) age = forms.IntegerField(label="年龄", initial=1, validators=[age_validate], error_messages={ 'required': '年龄不能为空', }) mobile = forms.IntegerField(label="手机号码", validators=[mobile_validate], error_messages={ 'required': '手机号码不能为空', }) status = forms.ChoiceField(label="用户状态", choices=STATUS, error_messages={ 'required': '用户状态不能为空', }) createdate = forms.DateTimeField(label="创建时间", required=False)- required 为空的时候的错误信息
- invalid 格式验证错误的信息
- min_length和max_length 长度不在设定的范围的错误信息
添加视图
def userinfo_form_msg(request): if request.method == "GET": myForm = UserInfoForm__Msg() return render(request, 'app1/userinfoform.html', {'form_obj': myForm}) else: f = UserInfoForm__Msg(request.POST) if f.is_valid(): print(f.cleaned_data['username']) else: errors = f.errors print(errors) return render(request, 'app1/userinfoform.html', {'form_obj': f, 'errors': errors}) return render(request, 'app1/userinfoform.html', {'form_obj': f})模板文件
这里还添加了表单的自我格式验证,获取表单的数据- f.clean() 获取全部数据
- f.clean_date[] 获取对应值的数据
- f.data 获取全部数据
模板文件:upload_form.html
模型文件
在models.py中添加模型,这里没有主键默认会生成id的主键class ImgFile(models.Model): name = models.CharField(verbose_name='用户名称', max_length=300, default="") heading = models.FileField(verbose_name='文件名', upload_to='media/uploads/') def __str__(self): return self.name class Meta: verbose_name = ' 用户头像信息' db_table = 'user_img'表单模型 form.py
class ImgFileForm(forms.Form): name = forms.CharField() heading = forms.FileField()视图模型
如果上传了文件,将文件保存在对应的目录下,并返回文件的信息。
def ingfileform(request): if request.method == "GET": f = ImgFileForm() return render(request, 'app1/upload_form.html', {'form_obj': f}) else: f = ImgFileForm(request.POST, request.FILES) if f.is_valid(): name = f.cleaned_data['name'] heading = f.cleaned_data['heading'] path = 'media/uploads/' if not os.path.exists(path): os.makedirs(path) dest = open(os.path.join(path + heading.name), 'wb+') for chunk in heading.chunks(): dest.write(chunk) dest.close() userimg = ImgFile() userimg.name = name userimg.heading = heading userimg.save() print('上传成功') return render(request, 'app1/upload_form.html', {'form_obj': f, 'user': userimg}) else: print(f.errors)路由
re_path 配置了可以直接在浏览器访问对应的文件,from django.urls import path, include, re_path from django.views.static import serve from mywed import settings path('app1/userimg/', views.ingfileform), re_path('media/uploads/(?P.*)', serve, {"document_root": settings.MEDIA_ROOT}), settings.py
这里路径在项目文件中设置便于统一,在实际的应用中也应该多在公共文件中设置MEDIA_URL = "media/uploads/" MEDIA_ROOT = os.path.join(MEDIA_URL, "")
模型表单
db中也登陆了对应的信息
Django提供了ModelForm可以直接和模型关联,省略了Form表单中定义的操作。
AJAX模板文件,为了能够正常的访问,必须添加csrfmiddlewaretoken或者在视图函数中注释@csrf_exempt,建议使用第一种方式
用户名: 密码: {% csrf_token %}视图文件
from django.views.decorators.csrf import csrf_exempt def ajax_login(request): return render(request, 'app1/ajax.html') # @csrf_exempt def ajax_login_data(request): if request.method == "GET": HttpResponse("内部自己的url") username = request.POST.get('username') password = request.POST.get('password') print(username) if username == 'admin' and password == '123456': return JsonResponse({ 'code': 1, 'msg': "登陆成功" }) else: print("222") return JsonResponse({ 'code': 0, 'msg': "登陆失败"
这里使用的是网上的jquery地址,也可在settings.py匹配如下,在网站根目录中创建static目录,放入jquery文件。STATIC_URL = '/statics/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, "statics"), ]Python相关栏目本月热门文章
- 1【Linux驱动开发】设备树详解(二)设备树语法详解
- 2别跟客户扯细节
- 3Springboot+RabbitMQ+ACK机制(生产方确认(全局、局部)、消费方确认)、知识盲区
- 4【Java】对象处理流(ObjectOutputStream和ObjectInputStream)
- 5【分页】常见两种SpringBoot项目中分页技巧
- 6一文带你搞懂OAuth2.0
- 7我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:虚拟机与Java虚拟机介绍
- 8【Spring Cloud】新闻头条微服务项目:FreeMarker模板引擎实现文章静态页面生成
- 9JavaSE - 封装、static成员和内部类
- 10树莓派mjpg-streamer实现监控及拍照功能调试
- 11用c++写一个蓝屏代码
- 12从JDK8源码中看ArrayList和LinkedList的区别
- 13idea 1、报错java: 找不到符号 符号: 变量 log 2、转换成Maven项目
- 14在openwrt使用C语言增加ubus接口(包含C uci操作)
- 15Spring 解决循环依赖
- 16SpringMVC——基于MVC架构的Spring框架
- 17Andy‘s First Dictionary C++ STL set应用
- 18动态内存管理
- 19我的创作纪念日
- 20Docker自定义镜像-Dockerfile
热门相关搜索路由器设置 木托盘 宝塔面板 儿童python教程 心情低落 朋友圈 vim 双一流学科 专升本 我的学校 日记学校 西点培训学校 汽修学校 情书 化妆学校 塔沟武校 异形模板 西南大学排名 最精辟人生短句 6步教你追回被骗的钱 南昌大学排名 清朝十二帝 北京印刷学院排名 北方工业大学排名 北京航空航天大学排名 首都经济贸易大学排名 中国传媒大学排名 首都师范大学排名 中国地质大学(北京)排名 北京信息科技大学排名 中央民族大学排名 北京舞蹈学院排名 北京电影学院排名 中国戏曲学院排名 河北政法职业学院排名 河北经贸大学排名 天津中德应用技术大学排名 天津医学高等专科学校排名 天津美术学院排名 天津音乐学院排名 天津工业大学排名 北京工业大学耿丹学院排名 北京警察学院排名 天津科技大学排名 北京邮电大学(宏福校区)排名 北京网络职业学院排名 北京大学医学部排名 河北科技大学排名 河北地质大学排名 河北体育学院排名 - as_ui 为表单提供



