dion-90

前面完成了主要的增删改查功能,后面将要进行的就是一些细节及安全方面的操作。

1.字段只读限制设定

1.1原admin只读体验

前面写了那么多的Django配置,配置流程应该是轻车熟路了,后面不在赘述具体配置的具体位置。

配置设置:

class CustomerAdmin(admin.ModelAdmin):
    list_display = (\'name\', \'id\',\'qq\',\'source\',\'consultant\',\'content\',\'status\',\'date\')
    list_filter = (\'source\',\'consultant\',\'date\')
    search_fields = (\'qq\',\'name\')
    raw_id_fields = (\'consult_course\',)
    filter_horizontal = (\'tags\',)
    list_editable = (\'status\',)
    actions = ("test_action", )
    readonly_fields = (\'qq\', \'consultant\')  #只读字段设定

显示效果:

1.2 编写只读功能

1.2.1 添加只读字段

king_admin_base.py文件中的基类添加字段:

#创建基类
class ModelAdmin(object):
    list_display = []
    list_filter = []
    search_fields = []
    ordering = None
    filter_horizontal = []
    actions = [\'delete_many_objects\']
    readonly_fields = []  #添加该字段
    list_per_page = 10

我们在Customer客户表中设置几个只读字段:

#自定义类,显示特定字段
class CustomerAdmin(ModelAdmin):
    list_display = [\'id\', \'qq\',\'name\',\'source\',\'consultant\',\'consult_course\',\'date\',\'status\']
    list_filters = [\'source\',\'consultant\',\'consult_course\',\'status\']
    search_fields = [\'qq\', \'name\', \'consultant__name\', ]
    ordering = \'date\'
    filter_horizontal = [\'tags\']
    readonly_fields = [\'qq\', \'consultant\'] #添加如此
    list_per_page = 2

字段配置完并没有达到我们想要的效果:

1.2.2 属性添加

到这里,我们要思考一些问题。在前端显示禁用效果需要在标签中添加什么? disabled很是关键的。

我们在哪里添加该属性呢? 回想一下我们的表单功能,是如何添加属性的,你就会明白了。

还有就是限制是针对哪个页面进行操作的?编辑页面。该怎么避免其他页面:添加页面? 答:在添加页面加一个标志符就行。

def table_object_add(request, app_name, table_name):
   admin_class = site.enabled_admins[app_name][table_name]
   admin_class.is_add_form = True  #标识符
   model_form = create_model_form(request, admin_class)
 
   if request.method == \'POST\':
       form_object = model_form(request.POST)
       if form_object.is_valid():
           form_object.save()
           return redirect(\'/king_admin/{app_name}/{table_name}\'.format(app_name = app_name,
                                                                        table_name = table_name))
   else:
       form_object = model_form()
 
   return render(request, \'king_admin/table_object_add.html\', {\'admin_class\': admin_class,
                                                               \'form_object\': form_object,
                                                               "app_name": app_name,
                                                               "table_name": table_name})

接下来,就需要在我们之前创建动态表单ModelForm那里添加判断语句。

forms.py文件,添加如下代码:

<-----------------定义创建对象的方法-----------------------------
  # 定义__new__方法,用于创建类,cls类名
  def __new__(cls, *args, **kwargs):
      # 遍历数据库的所有字段和字段对应的对象
      for field_name, field_obj in cls.base_fields.items():
          # 为字段对象的组件添加class属性
          field_obj.widget.attrs[\'class\'] = \'form-control\'
 
          #添加只读限制
          if not hasattr(admin_class, \'is_add_form\'): #排除添加页面
              if field_name in admin_class.readonly_fields:
                  field_obj.widget.attrs[\'disabled\'] = \'disabled\'
      # 创建当前类的实例--->即创建子类
      return ModelForm.__new__(cls)

现在来看看效果:

效果出来了!

1.3 BUG解决

显示效果确实达到了,那么问题又来了! 提交后竟然显示没有数据提交到后台,也就是说,禁用后框内的数据不能传入到后。

What The Fuck?

数据竟然没有传送,直接被抛弃了。。。

解决方法:

table_object_edit.html文件中的js函数中添加一行代码:

//提交所有数据
      function SelectAllChosenData() {
 
      $("select[class=\'right\'] option").each(function () {
          $(this).prop("selected",true);
      });
      //disabled数据处理<-------------添加这里
      $("form").find("[disabled]").removeAttr("disabled") ;
      return true;
  }

再来看看效果:

再来添加一个其他的试试看,比如tags。不过我们先要将filter_horizontal = [\'tags\']禁用掉:

#自定义类,显示特定字段
class CustomerAdmin(ModelAdmin):
    list_display = [\'id\', \'qq\',\'name\',\'source\',\'consultant\',\'consult_course\',\'date\',\'status\']
    list_filters = [\'source\',\'consultant\',\'consult_course\',\'status\']
    search_fields = [\'qq\', \'name\', \'consultant__name\', ]
    ordering = \'date\'
    #如下设置
    # filter_horizontal = [\'tags\']
    readonly_fields = [\'qq\', \'consultant\', \'tags\']
    list_per_page = 2

效果如下:

Wonderful!

2. 整篇只读限制设置

单个字段只读限制解决了,再来试试整篇的吧。

整篇表格进行只读限制,我们只需要将保存、删除、添加按钮不显示即可。

king_admin_base.py文件修改如下;
 
 
#创建基类
class ModelAdmin(object):
    list_display = []
    list_filter = []
    search_fields = []
    ordering = None
    filter_horizontal = []
    actions = [\'delete_many_objects\']
    readonly_fields = []
    readonly_table = True  #添加该字段
    list_per_page = 10
king_admin.py文件修改如下:
 
#自定义类,显示特定字段
class CustomerAdmin(ModelAdmin):
    list_display = [\'id\', \'qq\',\'name\',\'source\',\'consultant\',\'consult_course\',\'date\',\'status\']
    list_filters = [\'source\',\'consultant\',\'consult_course\',\'status\']
    search_fields = [\'qq\', \'name\', \'consultant__name\', ]
    ordering = \'date\'
    # filter_horizontal = [\'tags\']
    # readonly_fields = [\'qq\', \'consultant\', \'tags\']
    readonly_table = False
    list_per_page = 2
table_object_edit.html文件修改如下:
 
    {# 添加保存按钮 #}
    {% if admin_class.readonly_table %}
 
    {% else %}
     <div class="form-group">
         {# 添加删除功能,并独立出来,以免影响其他功能 #}
         {% block obj_delete %}
          <div class="col-sm-2">
                <a class="btn btn-danger" href="{% url \'king_admin:table_object_delete\' app_name table_name object_id %}">删除</a>
          </div>
          {% endblock %}
          <div class="col-sm-10 ">
            <button type="submit" class="btn btn-success pull-right">保存</button>
          </div>
      </div>
    {% endif %}
table_objs.html文件修改如下:
 
        <div class="panel-heading">
            <h3 class="panel-title">Panel title</h3>
          {% if admin_class.readonly_table %}
          {% else %}
            <button  class="btn btn-success pull-right" ><a href="{% url \'king_admin:table_object_add\' app_name table_name %}" style="color: white">添加</a></button>
          {% endif %}
          </div>

显示效果:

上面是达到了我们预期的功能,但是这样是不可靠的、不安全的,黑客很容易就能够进行数据的添加和修改。解决这个问题就需要我们后面要写的功能:后台的表单验证,来解决现存的问题

分类:

技术点:

相关文章: