modelform:models+form
 
建议尽量用Djangoform,更灵活,但也有人用modelform,写起来很简单
缺点,在models里面,表模型必须有__str__()方法
可添加钩子,用法一样
 
 

实例:

注释部分根据需求选择添加,其他为必须有的。
  1. class UserModelForm(ModelForm):
  2.  
  3. class Meta:
  4. model = models.UserInfo
  5. fields = "__all__"
  6. # fields = ['username','nickname',]
  7. # exclude = ['username',]
  8. # error_messages = {
  9. # "username": {'required':'用户名不能为空'}
  10. # }
  11. # widgets = {
  12. # "username":wid.Textarea(attrs={'class':'c1'})
  13. # }
  14. # labels = {
  15. # 'username':'用户名'
  16. # }
  17. # help_texts = {
  18. # 'username': '别瞎写,瞎写打你哦'
  19. # }
  20. #
  21. # field_classes = {
  22. # 'username': fld.EmailField
  23. # }
  24.  
  25. # 钩子
  26. # def clean_email(self):
  27. # pass
  28. #
  29. # def clean_nickname(self):
  30. # pass
  31. #
  32. # def clean(self):
  33. # pass
 
增加和修改,删除简单不示例。
  1. def user_add(request):
  2. # 现在的你# 创建Form类:
  3. if request.method == 'GET':
  4. model_form = UserModelForm()
  5. return render(request,'rbac/user_add.html',{'model_form':model_form})
  6. else:
  7. model_form = UserModelForm(request.POST)
  8. if model_form.is_valid():
  9. model_form.save()
  10. return redirect('/rbac/users.html')
  11.  
  12. return render(request, 'rbac/user_add.html', {'model_form': model_form})
  13.  
  14. def user_edit(request,pk):
  15. obj = models.UserInfo.objects.filter(pk=pk).first()
  16.  
  17. if not obj:
  18. return redirect('/rbac/users.html')
  19. if request.method == 'GET':
  20. model_form = UserModelForm(instance=obj)
  21. return render(request,'rbac/user_edit.html',{'model_form':model_form})
  22. else:
  23. model_form = UserModelForm(request.POST,instance=obj)
  24. if model_form.is_valid():
  25. model_form.save()
  26. return redirect('/rbac/users.html')
  27. return render(request, 'rbac/user_edit.html', {'model_form': model_form})
 
template
  1. # 表格:
  2. <body>
  3. <a href="/rbac/user/add.html">添加</a>
  4. <table border="">
  5. {% for row in user_list %}
  6. <tr>
  7. <td>{{ row.pk }}</td>
  8. <td>{{ row.nickname }}</td>
  9. <td>{{ row.username }}</td>
  10. <td>
  11. <a href="/rbac/user/edit/{{ row.pk }}.html">编辑</a>
  12. </td>
  13. </tr>
  14. {% endfor %}
  15. </table>
  16. </body>
  17.  
  18. # 添加:
  19. <body>
  20. <h1>添加用户</h1>
  21. <form method="POST" novalidate>
  22. {% csrf_token %}
  23. {{ model_form.as_p }}
  24. <input type="submit" value="提交" />
  25. </form>
  26. </body>
  27.  
  28. # 修改:
  29. <body>
  30. <h1>编辑用户</h1>
  31. <form method="POST" novalidate>
  32. {% csrf_token %}
  33. {{ model_form.as_p }}
  34. <input type="submit" value="提交" />
  35. </form>
  36. </body>

Django【进阶】modelform的更多相关文章

  1. django进阶-modelform&admin action

    先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...

  2. django进阶-3

    先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...

  3. 02:Django进阶篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  4. python 自动化之路 day 20 Django进阶/BBS项目【一】

    一.django进阶 1.django orm 增删改查 1.1.创建表: 1 2 3 >>> from blog.models import Blog >>> b ...

  5. python web框架 Django进阶

    django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制.既然 ...

  6. Python之路,Day16 - Django 进阶

    Python之路,Day16 - Django 进阶   本节内容 自定义template tags 中间件 CRSF 权限管理 分页 Django分页 https://docs.djangoproj ...

  7. Django中ModelForm应用

    Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...

  8. django进阶补充

    前言: 这篇博客对上篇博客django进阶作下补充. 一.效果图 前端界面较简单(丑),有两个功能: 从数据库中取出书名 eg: 新书A 在form表单输入书名,选择出版社,选择作者(多选),输入完毕 ...

  9. django进阶-4

    前言: 下篇博客写关于bootstrap... 一.如何在脚本测试django from django.db import models class Blog(models.Model): name ...

  10. Django进阶篇【1】

    注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...

随机推荐

  1. Kafka生产者各种启动参数说明

    首先是启动一个生产者 final String kafkazk="localhost:9092"; String topic="testAPI"; Proper ...

  2. shell脚本如何获取当前时间

    在shell脚本里常常需要获取系统时间来处理某项操作,linux的系统时间在shell里是可以直接调用系统变量的如: 获取今天时期:`date +%Y%m%d` 或 `date +%F` 或 $(da ...

  3. Android四大组件之Activity & Fragement(续)

    1.Activity和Fragment的异同. Activity是UI界面交互的主体,而fragment是这个主体上的元素. 一个activity可以包含0到n个fragment. fragment可 ...

  4. SQL 临时表或表变量替代游标(转)

    1.如果表没有自动增长的标识列(int) 使用临时表 SELECT IDENTITY(int) NewID ,.. INTO #tmp FROM YouTable 2.表有标识列 使用表变量 INSE ...

  5. 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)

    [BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...

  6. BIOS和CMOS的区别

    原文链接:https://www.cnblogs.com/boltkiller/articles/5732424.html 在日常操作和维护计算机的过程中,常常可以听到有关BIOS设置和CMOS设置的 ...

  7. LCA的倍增算法

    LCA,即树上两点之间的公共祖先,求这样一个公共祖先有很多种方法: 暴力向上:O(n) 每次将深度大的点往上移动,直至二者相遇 树剖:O(logn) 在O(2n)预处理重链之后,每次就将深度大的沿重链 ...

  8. DotNet,PHP,Java的数据库连接代码大全(带演示代码)

    C#数据库连接字符串 Web.config文件 <connectionStrings> <!--SQLServer数据库连接--> <add name="con ...

  9. 基于epoll封装的事件回调miniserver

    epoll技术前两节已经阐述过了,目前主要做一下封装,很多epoll的服务器都是采用事件回调方式处理, 其实并没有什么复杂的,我慢慢给大家阐述下原理. 在networking.h和networking ...

  10. dmsg命令使用

    http://note.youdao.com/noteshare?id=6771284da9f10ac35652907898d63141