添加功能,还是使用, form 组件来完成!  并且 完成添加之后,需要保留原搜索条件。

    def memory_url(self):
'''用于反向生成url, 并且携带,get请求的参数,跳转到下一个网页'''
name = "%s:%s" % (self.site.namespace, self.get_add_url_name)
base_url = reverse(name)
# 记录原搜索条件
if not self.request.GET:
add_url = base_url
else:
param = self.request.GET.urlencode() # 获取到GET请求的,所有的参数。 ?page=1&age=20
new_query_dict = QueryDict(mutable=True)
new_query_dict["_filter"] = param
add_url = "%s?%s" % (base_url, new_query_dict.urlencode())
return add_url

通过这个函数, 已经在。 展示页面, 为 添加按钮,指定了  URL。
进入添加页面之后, 已经携带着,  展示页面的 GET 请求的信息。 进入了 添加页面。
那么,添加完成之后。 跳转回, 展示页面的时候。 也需要将 GET 信息。 原封不动的,带回 展示页面。
先看  添加页面的 基础需求:
因为,所有的添加页面, 都是使用的同一个 模板。 来完成。。。  可以使用 form 组件来完成这件事。

    model_form_class = None  # 预留自定义接口

    def get_model_form_class(self):
if self.model_form_class:
return self.model_form_class class DynamicModelForm(StarkModelForm):
class Meta:
model = self.model_class
fields = "__all__" return DynamicModelForm

因为在基类中, 初始化函数中, 定义了  model_class  这个就是, 各自的 模型表的类。

默认显示  “__all__"    并返回。 这个form 类。  并且预留了接口。 model_form_class

看一看: 添加的视图:

    def add_view(self, request):
'''
添加页面
:param request:
:return:
''' model_form_class = self.get_model_form_class()
if request.method == "GET":
form = model_form_class()
return render(request, "stark/change.html", {"form": form})
form = model_form_class(data=request.POST)
if request.method == "POST":
if form.is_valid():
# form.save()
return redirect(self.memory_reverse())
return render(request, "stark/change.html", {"form": form})

可以看到, 再添加的视图中。 我们通过调用self.get_model_form_class()  来得到。 form 类。 并传递给了 模板。
当预留的接口,没有值得时候, 使用得就是,默认得全部显示。|

如果需要,进行自定制,也是可以的。  这就需要在。 子类中为  model_form_class = None 这个预留得接口。 为他赋一个值。
这个值,就是一个。 自己重写之后得,form 类。

比如: 在原来得基础上。 再添加上一个字段。

class UserInfoModelForm(StarkModelForm):
xx = forms.CharField() class Meta:
model = models.UserInfo
fields = "__all__" class UserInfoHandler(StartHandler):
list_display = ["name", "age", "depart", get_choice_txt("性别", "gender"), StartHandler.display_edit,
StartHandler.display_del]
per_page = 1 # 重订 每页显示 多少 数据
has_add_btn = True model_form_class = UserInfoModelForm

写一个form类。 并且多了一个  xx 得字段。
然后将这个类, 赋值给了 model_form_class   这样。 对象再去找这个变量得时候。 因为优先找自己得类, 也就是  UserInfoHandler
发现有这个  model_form_class  ,然后他就会使用这个变量。
在调用self.get_model_form_class() 得时候。 内部进行了判断。 这个model_form_class 不为空。 就直接 return 了 model_form_class
这样,在 添加视图中, 接收到得, 就是。 添加了 xx 字段得 。 这个 form 类。
在页面显示得 时候。 就能够,看到这个类!

添加字段可以了。 那么如何减少一个字段呢?

class UserInfoModelForm(StarkModelForm):
class Meta:
model = models.UserInfo
fields = ["name", "gender", "age", "depart"] # 原本全部的话 是需要再增加一个 pwd 的。

fields  不再 使用  "__all__"  而是自己指定。 想要显示得字段。
但是,有一个问题就是。 不显示这个字段。 表示用户不能进行输入这个字段。
那么数据库在进行保存得时候, 这个字段,没有值, 他该怎么个保存?   这样就必须提供一个默认得值

也就是说,现实的时候虽然收一个字段, 但是保存得时候,必须提供一个默认得值:
所以在添加视图函数中,再保存的,时候,我需要一个可以自定制的,保存功能。
先看代码基类的代码, 为了支持自定制的功能。 在基类中新增一个函数 save()  这个函数默认使用 form.save():

StarkHandel(objects):
  .............   def save(self, form, is_update=False):
form.save() def add_view(self, request):
'''
添加页面
:param request:
:return:
''' model_form_class = self.get_model_form_class()
if request.method == "GET":
form = model_form_class()
return render(request, "stark/change.html", {"form": form})
form = model_form_class(data=request.POST)
if request.method == "POST":
if form.is_valid():
           # 这里不再使用 form.save() 而是使用类中的save()函数。让这个方法去帮我保存。
         # 这样的话,我在子类中,就可以进行。重写 save 这个方法。 从而实现,我想要默认保存的 哪个字段
self.save(form, is_update=False)
return redirect(self.memory_reverse())
return render(request, "stark/change.html", {"form": form})
  ...............
class UserInfoModelForm(StarkModelForm):
class Meta:
model = models.UserInfo
fields = ["name", "gender", "age", "depart"] class UserInfoHandler(StartHandler):
list_display = ["name", "age", "depart", get_choice_txt("性别", "gender"), StartHandler.display_edit,
StartHandler.display_del] model_form_class = UserInfoModelForm def save(self, form, is_update=False):
form.instance.pwd = 123 # 通过instance 为想要的 字段。 制定一个默认的保存 值。 我这里为 pwd 字段 默认保存 123
form.save() # 然后在这里进行 保存的工作。

这样就可以为 一张表,进行自定制的,保存工作。  并且只有 UserInfoHandler  这个子类,重写了 save 方法。

其他的子类。没有重写这个方法。 所以在不同的对象再找的时候, 之后UserInfoHandler  的对象,能够找到自己的 save 函数。 其他的依然使用的是, 父类的 save 函数。

这样, 就不会相互的影响。

stark组件开发之添加功能实现的更多相关文章

  1. stark组件开发之编辑功能实现

    编辑功能.和添加一样! 唯一不同的就是, 需要编辑一个指定的  记录.这就需要,在列表页面, 渲染编辑的时候,添加一个 id 值: class UserInfoHandler(StartHandler ...

  2. stark组件开发之添加按钮显示和URL

    添加: 需求: 根据用户的权限, 决定是否,有添加按钮.  通过配置进行定制,预留钩子进行权限的判断. class StartHandler(object): .................... ...

  3. stark组件开发之列表页面定制列

    先看一张页面展示的效果图: 看一看我的  model 表!是什么样子: 看一看数据库是什么样子: 看 页面展示图,有表头. 有数据.模型表中,每一个字段, 都指定了 verbose_name. 如何解 ...

  4. stark组件开发之列表页面应用示例

    已经解决的,自定义的扩展函数,功能.但是 不可能返回. 一个 固定的页面把!  应该是,点击那条 记录之后的编辑, 就会跳转到相应的,编辑页面.所以 这个标签的  <a href="/ ...

  5. stark组件开发之批量操作

    class UserInfoHandler(StartHandler): ....... # 批量操作功能的列表,添加则显示, 使用此功能.需要将StartHandler.display_checkb ...

  6. stark组件开发之组合搜索页面效果和 URL

    页面效果,只是样式.这个好解决!yield 的时候. 返回几个样式出去就好了! 并且前端写上一些样式的css {% if search_group_row_list %} <div class= ...

  7. stark组件开发之组合搜索实现思路

    - 关键字搜索. 可以做到的效果是, 输入20. 后太通过 Q()  函数. 来实现.  搜索是一个大的问题点. -  要想实现组合搜索, 首先要 明确的一点是. 在我当前的页面上, 正在进行展示的是 ...

  8. stark组件开发之关键搜索

    - 模糊搜索: 在页面生成一个表单.  以get 方式, 将数据提交到.当前查看页面. 后台接收数据,然后进行筛选过滤. 着个也需要,用户自定制!   定义一个  search_list  这个值,默 ...

  9. stark组件开发之分页

    """ 分页组件 """ class Pagination(object): def __init__(self, current_page ...

随机推荐

  1. day 12

    一,什么是装饰器? 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事 ...

  2. Flutter 知识点

    Flutter:一个移动应用开发框架,它使用 Dart.C++.Skia 开发,对外提供了完全不依赖系统平台的 Widget 的能力,只通过自绘图形的方式工作,具有极其优秀的跨平台性.目前已经支持了 ...

  3. Spring Cloud(Dalston.SR5)--Zuul 网关-微服务集群

    通过 url 映射的方式来实现 zuul 的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了.实际上在实现微服务架构时,服务名与服务实例地 ...

  4. Docker三大核心概念及DockerToolBox安装

    一.核心概念 Docker大部分操作都围绕三大概念——镜像.容器和仓库展开. 1.Docker镜像 Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板.镜像是创建Docker容器的基础. ...

  5. Python第一天:python2.x和python3.x的区别

    查看Python版本 # python -V Python2.7.5是centos7中默认安装的Python [root@localhost ~]# python -V Python [root@lo ...

  6. docker入门 什么是docker? 为什么使用docker?

    1.什么是docker? 轻量级操作系统虚拟化解决方案 2.为什么使用docker? 1.docker的启动是秒级的,比传统虚拟机快很多 2.资源利用率高,一台主机上可同时运行数千个docker容器 ...

  7. Java内存列表

    当jvm运行起来的时候,它会向系统申请一片内存区,并将这块内存分出一部分存储程序创建的对象,传递给方法的参数,返回值,局部变量等等,我们将这块内存称之为“运行时数据区”. 初学的时候把Java内存分为 ...

  8. wordpress 解决文章内http链接问题

    1. 登录Wordpress后台, 常规设置  > 里面把站点URL 修改成 https开头 2. 登录phpmyadmin , 执行替换链接的SQL 替换wordpress配置的链接地址 (可 ...

  9. Django和SQLAlchemy,哪个Python ORM更好?

    ORM是什么? 在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途. ORM代表对象关系映射.ORM中的每个单词解释了他们在实际项 ...

  10. uva-10400-搜索

    题意:题意很简单,就是输入数字,对数字进行加减乘除,然后能不能得到最后的数字. wa了很多次,memcpy(dst,src,sizeof(dst))才对,最后一个参数写错,最后一个参数是要拷贝的字节数 ...