3,django中的admin组件之自定义组件的增删改查的完善

 

 

昨天我们将自定义列放在类我们自定义的Bookconfig配置类内,但是这样就写死了,因为当我们访问publish表的时候应该也有这样的自定义列,所以我们应该将我们的自定义列放在默认的配置表里面。应该怎么做?

 当我们的自定义列挪到默认配置类的时候,我们自定义配置类中的list_display就要发生改动,

list_display = ["title", "price", "publish",'authors','publishDate',sites.ModelAdmin.edit,sites.ModelAdmin.delete]

而在默认配置类中,往list_display添加edit,delete。list_display = ['__str__',edit,delete]。这样写会很麻烦。

我们有这样一个办法,在默认配置类中,我们新构建一个列表,然后把我们自定义配置类的list_display添加到这个新列表中,并且把edit,和delete也添加进去,这样在循环新的list-display的时候,既能实现到自己配置类中的list_display,也能实现默认配置类中的list_display,

 

 # 默认操作函数
  def edit(self,obj=None,is_header=False):
        if is_header:   #  如果传过来的参数is_header=true则说明是表头部分
            return '操作'
        else:       # 如果传过来的参数为obj,则说明是表单部分
            return mark_safe("<a href='/stark/app01/book/%s/change/'>编辑</a>"%obj.pk)
    def delete(self,obj=None,is_header=False):
        if is_header:
            return '操作'
        else:
            return mark_safe("<a href='/stark/app01/book/%s/delete/'>删除</a>" % obj.pk)
    def check_box(self, obj=None, is_header=False):
        if is_header:
            return '操作'
        else:
            return mark_safe("<input type='checkbox'pk=%s>" % obj.pk)
#视图函数
def new_list_display(self):
temp=[]
temp.extend(self.list_display) # 把自己配置类中的list_display添加进去,
# 对于没有自定义配置类的model,就是用默认配置类的list_display 注意用的是extend
temp.insert(0,ModelAdmin.check_box) # 在最前面加ModelAdmin.check_box,不要写成self.check_box 这是个坑,一定不要写成self.check_box
                        # 如果写成了self.edit,
说明已经在edit这个方法中传了参数self,在调用的时候,就不需要传self这个参数了
temp.append(ModelAdmin.edit)
temp.append(ModelAdmin.delete)
return temp

 

这时候我们发现,自定义列中的标签写死了,我们希望访问每个model都有这个自定义操作列。

这时候我们想到url的反向解析。

拿一个操作来说,在url中起好name,利用revers反向解析url。替换a标签的href。

写成函数之后,就变成这样:

 

接下来就是利用ModelForm对数据进行操作了。(复习ModelForm知识.)

我们发现,不仅在添加视图函数中用到modelform,在编辑,甚至删除的试图中也用到modelform。所以可以写成函数。

在app01下的stark.py文件下可以写自己的model form

在页面中渲染:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加数据</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css">
    <link rel="stylesheet" href="/static/css/form.css">
</head>
<body>
<div class="container">
    <h3>添加数据</h3>
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
           <form action="" method="post" novalidate class="form-horizontal">
                {% csrf_token %}
                {% for field in form %}
                    <div class="form-group">
                        <label for="" class="col-sm-2 control-label">{{ field.label }}</label>
                        {{ field }}
                        <div><span class="errors pull-right" style="color:red">{{ field.errors.0 }}</span></div>
                    </div>
                {% endfor %}
                <button class="btn btn-default">提交</button>
            </form>
        </div>
    </div>
</div>
</body>
</html>

接下来就是给list页面添加页码了。

 我们直接将之前写的分页拿过来用,

 

posted @ 2020-05-09 17:12  傻白甜++  阅读(612)  评论(0编辑  收藏  举报
TOP