Django中的模型如何自定义属性,然后 “挂到”django admin自动生成的界面?

继承admin.ModelAdmin可以自动生成此model一个管理界面,包括listview(列表),和detailview(详情)两部分,用于展示和编辑模型的属性。

但比如我现在有一个Person模型,他的生日是存到数据库中的,但是年龄并不存,因为可以通过今天计算出来,所以它虽不在数据库中,但也算是模型的一个属性,那么在django中如何写一个这样的属性?,一个“非存储属性”,能在操作模型的时候使用,用起就像就像普通属性一样,也能够挂到admin的列表页和详情页上?

阅读 5k
3 个回答

直接在 model 中创建计算生日的方法,然后在 admin 里面调用就可以了。

admin可以这样调用?哈哈,我曾经掉到一个坑里,分享下,自己在model层创建了一个相应的“非存储属性”,然后想通过ORM用正常属性的方式进行filter等操作,发现不行~~~~

可以在“列表”页面添加。
参考django admin文档中的ModelAdmin.list_display的相关内容。
http://python.usyiyi.cn/trans...

# 一个接受对象实例作为参数的可调用对象。 像这样:
def upper_case_name(obj):
    return ("%s %s" % (obj.first_name, obj.last_name)).upper()
upper_case_name.short_description = 'Name'

class PersonAdmin(admin.ModelAdmin):
    list_display = (upper_case_name,)
   
# 一个表示ModelAdmin 中某个属性的字符串。 行为与可调用对象相同。 像这样:
class PersonAdmin(admin.ModelAdmin):
    list_display = ('upper_case_name',)

    def upper_case_name(self, obj):
        return ("%s %s" % (obj.first_name, obj.last_name)).upper()
    upper_case_name.short_description = 'Name'

 # 表示模型中某个属性的字符串。 它的行为与可调用对象几乎相同,
 # 但这时的self 是模型实例。 这里是一个完整的模型示例︰

from django.db import models
from django.contrib import admin

class Person(models.Model):
    name = models.CharField(max_length=50)
    birthday = models.DateField()

    def decade_born_in(self):
        return self.birthday.strftime('%Y')[:3] + "0's"
    decade_born_in.short_description = 'Birth decade'

class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'decade_born_in')
    
'''
Django 会尝试以下面的顺序解释list_display 的每个元素︰
- 模型的字段。
- 可调用对象。
- 表示ModelAdmin 属性的字符串。
- 表示模型属性的字符串。
'''
    
    

在控制“详情”页面内容的设置ModelAdmin.fieldsetsModelAdmin.fields中没有发现相关功能

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题