博客项目

深浅coopy运用

为什么在类中引用函数不用self 而是用类名调用


def search_boutton(self,obj=None,header=False):
    if header:
  return "操作"
  else:
  url = reverse("%s_%s_update"%(self.app_name,self.table_name),args=[obj.pk,]) # 反向解析
  return mark_safe("<a href='%s'>编辑</a>" % url)





def rebulid_display_list(self):
  tem=[]
  tem.append(ModelXadmin.checkbox_button) # 把选择框加到表头和表单前面,
  # 之所以用类,是因为在缺省形参中,如果调用一次,之后的参数都会发生改变,
  tem.extend(self.list_display) # 把实例化对象自身的数据加到tem当中

  if not self.list_display_link: # 是否传有link项
  tem.append(ModelXadmin.search_boutton)
  tem.append(ModelXadmin.delete_button) # 把选择框加到表头和表单前面,
  return tem

         这是因为函数中有缺省参数,如果 用self调用,就会指向自己的方法内,缺省参数有一次改变,之后的调用都是指向该值,即参数会改变,而函数则是不一样,他的缺省参数,默认的是原始值.

 ModelForm的补充

```
def get_models_form(self):
if not self.Model_Form_class:
class Model_Form(ModelForm):
class Meta:
model = self.model
fields = "__all__"
labels = {
""
}
return Model_Form # 查看列表,即主页,并对相应字段配上路径
else:
return self.Model_Form_class
```
# __str__,get_field,getattr
__str __,当用getattr进行取值,默认返回对象内的__str __内返回值
```
class Tag(models.Model):
"""
标签
"""
nid = models.AutoField(primary_key=True)
title = models.CharField(max_length=32) # 标签名
blog = models.ForeignKey(to="Blog", to_field="nid" ,on_delete=models.CASCADE) # 所属博客

def __str__(self):
return self.title

class Meta:
verbose_name = "标签"
verbose_name_plural = verbose_name

 

obj=models.Blog.objects.filter().first()
getattr(obj,field)
---------------------------------
结果是:
self.title对应的值,因为双下划綫一定会执行的

```

       get_field(field _name)获取字段对应的对象,如title = models.CharField(max _length=32) ,我们获取到的是CharField实例化的对象,通过对象就可以拿到相应的参数值

title_list.append(self.model._meta.get_field(field).verbose_name) #求字段中文


     getattr获取对象,或者模块当中相应的属性值,或者函数名,即反向解析字符串


 反向解析

切记第二个参数是可迭代数据,因此否则会报错
```
from django.urls import reverse
def get_udate_url(self,obj):
_url = reverse("%s_%s_update" % (self.app_name, self.table_name), args=[obj.pk, ]) # 反向解析
return _url
```
# 字符串标签安全布局
```
from django.utils.safestring import mark_safe
def checkbox_button(self,obj=None,header=False):
if header:
return mark_safe("<label><input type='checkbox' name='check' class='control_all'></label>")
return mark_safe("<label><input type='checkbox' class='item_choice'></label>")
```
原文地址:https://www.cnblogs.com/AbnerLc/p/11191747.html