知识点归纳:
extend 把两个列表合并;
添加id,编辑, 删除 按钮到页面上
1、把list_display里面的字段合并到新的列表中,再把编辑,删除按钮和页面内容展示出来,
把这些封装成函数,然后传参过来is_header=False,如果是True就返回头标名字;
# 需要把delete_col和list_display放进一个新的配置类列表中 def get_new_list_display(self): new_list_display = [] new_list_display.extend(self.list_display) new_list_display.append(ModelStark.edit_col) new_list_display.append(ModelStark.delete_col) # 把插入的放到列表的第一位去 new_list_display.insert(0, ModelStark.check_col) return new_list_display
def delete_col(self, obj=None, is_header=False): app_label = self.model._meta.app_label model_name = self.model._meta.model_name if is_header: return ‘删除‘ # 返回 href=‘%s/delete/‘这样写就是在原来的url基础上增加 ID值/delete/ # 但是利用django的反向解析就可以通过动态改变url,使url写好的url可以改变 _url = reverse(‘delete‘, args=(obj.pk,)) # /id/delete/ # /1/delete/ # / 1 / deletew / print(_url) return mark_safe("<a href=‘%s‘>删除</a>" % _url) def edit_col(self, obj=None, is_header=False): app_label = self.model._meta.app_label model_name = self.model._meta.model_name if is_header: return ‘编辑‘ # url(‘^(\d+)/delete/$‘, self.delete_view, name=‘delete‘) _url = reverse(‘%s_%s_change‘ % (app_label, model_name), args=(obj.pk,)) return mark_safe("<a href=‘%s‘>编辑</a>" % _url) def check_col(self, obj=None, is_header=False): if is_header: return ‘选择‘ return mark_safe("<input type=‘checkbox‘>")
2、插入头部和表单数据到table里面
做了一件事情就是遍历, 字段和方法
head_list = [] for field_or_func in self.get_new_list_display(): # 判断field_or_func是否是字符串,如果是就代表传过来的是字段名 if isinstance(field_or_func, str): # 如果是字段名如果等于 ‘__str__‘ 就表示拿到的是默认的字段规则 if field_or_func == ‘__str__‘: # 获取当前model对象的字段值 val = self.model._meta.model_name.upper() # 拿到的是自定义的注册规则的字段 else: # 获取自定义字段的值 # _meta.get_field(字段字符串) field_obj = self.model._meta.get_field(field_or_func) val = field_obj.verbose_name else: # 拿到自定义的头部字段名称 val = field_or_func(self, is_header=True) head_list.append(val) # 表单数据 data_list = [] for obj in queryset: temp = [] # 循环new_list_display里面所有的字段名与函数 for field_or_func in self.get_new_list_display(): # 判断field_or_func是不是字符串,是就代表是字段名 if isinstance(field_or_func, str): # 把field当成字符串属性了 所以需要通过反射 getattr(obj, field) val = getattr(obj, field_or_func) else: # 如果是函数就直接调用,当作函数来用把self 和 obj传进去 val = field_or_func(self, obj) # 把所有的field temp.append(val) # obj.authors 多对多字段就需要通过判断来处理 # Django的admin一旦碰到多对多的表就会直接报错 意思就是让我们去自定义 data_list.append(temp) print(data_list) return render(request, "stark/list_view.html", {"data_list": data_list, ‘head_list‘: head_list})
3、用reverse反转动态匹配跳转url
def get_urls(self): app_label = self.model._meta.app_label model_name = self.model._meta.model_name temp = [ url(‘^$‘, self.list_view, name=‘%s_%s_list‘ % (app_label, model_name)), url(‘^add/$‘, self.add_view, name=‘%s_%s_add‘ % (app_label, model_name)), # 需要把id传过来要不然不可以通过id获取到需要修改的 url(‘^(\d+)/change/$‘, self.change_view, name=‘%s_%s_change‘ % (app_label, model_name)), # /1/deletew/ url(‘^(\d+)/delete/$‘, self.delete_view, name=‘delete‘) ] return temp
原文地址:https://www.cnblogs.com/kermitjam/p/9357292.html
时间: 2024-10-10 16:32:28