• stark组件开发之添加功能实现


    添加功能,还是使用, 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 函数。

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

  • 相关阅读:
    CentOS7 常用命令集合
    Microsoft Visual C++ 14.0 is required问题的解决或warning: Debugger speedups using cython not found
    microsoft visual c++与microsoft visual net 版本对应关系
    [Python爬虫] 之三十一:Selenium +phantomjs 利用 pyquery抓取消费主张信息
    Selenium support for PhantomJS has been deprecated, please use headless
    PyDev:warning: Debugger speedups using cython not foun
    文本相似性计算总结(余弦定理,simhash)及代码
    解决 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type的问题
    Java Web学习总结-文件下载
    jsp button提交表单
  • 原文地址:https://www.cnblogs.com/chengege/p/10741154.html
Copyright © 2020-2023  润新知