如何在Django管理模型中自动添加字段

2024-05-18 20:36:17 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以在django管理界面添加一个年龄字段,该字段在运行时根据另一个出生日期字段自动填充,我添加了一个屏幕截图,试图解释更多我的意思 enter image description here

我的模特

class FamilyMember(models.Model):
   transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
   family_group = models.ForeignKey(FamilyGroup,
                                on_delete=models.CASCADE,
                                null=True,
                                blank=True)
   name = models.CharField(max_length=100, null=True, blank=True)
   date_of_birth = models.DateField(null=True, blank=True)
   relationship = models.ForeignKey(Relationship, on_delete=models.PROTECT)
   dependant_child_age_range = models.ForeignKey(DependantChildAgeRange,
                                            null=True,
                                            blank=True,
                                            on_delete=models.PROTECT)
   care_percentage = models.PositiveSmallIntegerField(
    null=True, blank=True, validators=[
        MaxValueValidator(100),
    ])
   income = models.DecimalField(max_digits=6,
                            decimal_places=2,
                            null=True,
                            blank=True)
 rent_percentage = models.PositiveSmallIntegerField(
     null=True, blank=True, validators=[
        MaxValueValidator(100),
    ])

管理员

class FamilyMemberInline(admin.TabularInline):


def formfield_for_foreignkey(self, db_field, request, **kwargs):
    action = request.META['PATH_INFO'].strip('/').split('/')[-1]
    if action == 'change':
        transaction_id = request.META['PATH_INFO'].strip('/').split('/')[-2]
        if db_field.name == "family_group":
            kwargs["queryset"] = FamilyGroup.objects.filter(transaction=transaction_id)
    return super(FamilyMemberInline, self).formfield_for_foreignkey(db_field, request, **kwargs)



model = FamilyMember
extra = 0
def sufficient_info_provided (self, obj):
    return obj.sufficient_information_provided
sufficient_info_provided.boolean = True



readonly_fields = ['sufficient_info_provided',]

Tags: selftruefielddbonmodelsrequestdelete
1条回答
网友
1楼 · 发布于 2024-05-18 20:36:17

用计算重写内联的^{}方法以annotate查询集。注释将向queryset中的每个对象添加一个age属性

然后,正如您在^{}文档中看到的,您可以包含一个字符串,表示接受一个参数的ModelAdmin方法,即模型实例。Inline的工作方式相同,但必须在ModelAdmin.readonly_fields中包含该方法

总而言之:

class FamilyMemberInline(admin.TabularInline):
    ...
    fields = (..., 'get_age')
    readonly_fields = ('get_age',)

    def get_queryset(self, request):
        return (
            super().get_queryset(request)
            .annotate(age=...)
        )

    def get_age(self, instance):
        return instance.age

相关问题 更多 >

    热门问题