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


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

    class UserInfoHandler(StartHandler):
        # 自定制,展示页面, 需要展示的东西。 根据每张表的不同。 自己编写!
        list_display = [StartHandler.display_checkbox, "name", "age", "depart", get_choice_txt("班级", "classes"),
                        get_choice_txt("性别", "gender"), StartHandler.display_edit, StartHandler.display_del]

    上面基类中,在 list_dispaly 类表中, 添加了!  StartHandler.display_edit,  StartHandler.display_del  这是两个在, 基类中。 定义好的删除和编辑的,按钮。 列表视图。再循环这个列表时, 如果有这两个函数,那么就会执行他,这个函数通过 memory_url 解析出url来。 并返回。  视图中就接受到这个 URL 添加到。 列表中,交给。 模板进行渲染。

    class StartHandler(object):
        list_display = []
    
       ......................# 用于在 a 标签。 携带本次GET 请求参数
        def memory_url(self, get_url_name, *args, **kwargs):
            '''用于反向生成url, 并且携带,get请求的参数,跳转到下一个网页'''
            name = "%s:%s" % (self.site.namespace, get_url_name)
            base_url = reverse(name, args=args, kwargs=kwargs)
            # 记录原搜索条件
            if not self.request.GET:
                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
                url = "%s?%s" % (base_url, new_query_dict.urlencode())
            return url
    
        # 用于 跳转会原页面时,解析出 GET 请求的参数。并拼接
        def memory_reverse(self, get_url_name, *args, **kwargs):
            name = "%s:%s" % (self.site.namespace, get_url_name)  # get_url_name是,类内部封装好的函数的来
            url = reverse(name, args=args, kwargs=kwargs)
            origin_params = self.request.GET.get("_filter")
            if origin_params:
                url = "%s?%s" % (url, origin_params)
            return url
    # 用于用户自定制, 是否显示编辑按钮, 和显示的样式
        def display_edit(self, obj=None, is_header=None):
            '''
            自定义页面,显示的列,(表头和内容)
            :param obj:   数据库中每一行记录的 model对象
            :param is_header:  判断是否为表头
            :return:
            '''
            if is_header:
                return "编辑表头"
            # name = "%s:%s" % (self.site.namespace, self.get_edit_url_name)  # 拼接 stark:app01_userinfo_change
            return mark_safe("<a href='%s'>编辑</a>" %
                             self.memory_url(get_url_name=self.get_edit_url_name, pk=obj.pk))
    
        # 用于用户自定制, 是否显示删除按钮
        def display_del(self, obj=None, is_header=None):
            if is_header:
                return "删除表头"
            # name = "%s:%s" % (self.site.namespace, self.get_del_url_name)
            return mark_safe("<a href='%s'>删除</a>" %
                             self.memory_url(get_url_name=self.get_del_url_name, pk=obj.pk))
    
        per_page = 10  # 默认每页显示,多少数据。 也可在子类中,自行定制
        def check_list_view(self, request, *args, **kwargs):
            ................
    # ##################5. 处理表格###################### data_list = query_set[pager.start:pager.end] # 对得到的内容。 进行切片获取,并展示到页面上 body_list = [] for row in data_list: row_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): # 这里is_header=False obj=row(数据库中循环的每一行的对象) row_list.append(key_or_func(self, obj=row, is_header=False)) else: row_list.append(getattr(row, key_or_func)) else: row_list.append(row) body_list.append(row_list)
          .....................
    return render(request, "stark/changelist.html", {"header_list": header_list, "data_list": data_list, "body_list": body_list, "pager": pager, "add_btn": add_btn, "search_list": search_list, "search_value": search_value, "action_dict": action_dict})
      
       @property
        def get_list_url_name(self):
            '''获取列表页面URL 的name'''
            return self.get_url_name("list")

        @property
        def get_add_url_name(self):
            '''获取添加页面URL 的name'''
            return self.get_url_name("add")

        @property
        def get_edit_url_name(self):
            '''获取修改页面URL 的name'''
            return self.get_url_name("change")  # app01_userinfo_change

        @property
        def get_del_url_name(self):
            '''获取删除页面URL 的name'''
            return self.get_url_name("del")

    编辑的视图函数, 根据pk  拿到数据库中!相对应的数据:

    并传给 form类。  使用instance  制定这个就可以了!

    POST 过来的时候, 连带着,前端过来的数据, 和 当前更改对象。 一样 使用 instance 传给 form 就行了!

        def change_view(self, request, pk):
            '''
            编辑页面
            :param request:
            :return:
            '''
            current_change_obj = self.model_class.objects.filter(pk=pk).first()
            if not current_change_obj:
                return HttpResponse("要修改的页面不存在,请重新选择")
    
            model_form_class = self.get_model_form_class()
            if request.method == "GET":
                form = model_form_class(instance=current_change_obj)
                return render(request, "stark/change.html", {"form": form})if request.method == "POST":
           form = model_form_class(data=request.POST, instance=current_change_obj)
    if form.is_valid(): self.save(form, is_update=False) return redirect(self.memory_reverse(self.get_list_url_name)) return render(request, "stark/change.html", {"form": form}) return HttpResponse("编辑页面")
  • 相关阅读:
    同样的请求img代码,单个html文件和项目中的html文件请求结果不一样
    CSS中A标签断字不换行问题(基础知识)
    句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))
    Ext.Net 控件FileUploadField上传文件
    500内部服务器错误。你查找的资源存在问题,因而无法显示
    WebService 错误:无法加载协定为xxx的终结点配置部分,因为找到了该协定的多个终结点配置
    SyntaxError: unterminated string literal
    servlet入门
    myeclipse视图布局恢复
    JavaWEB开发入门
  • 原文地址:https://www.cnblogs.com/chengege/p/10741522.html
Copyright © 2020-2023  润新知