对模型使用自定义方法而不是__unicode __ / __ str__?

时间:2015-11-05 20:40:53

标签: python django django-admin

我有两个型号,

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    surname = models.CharField(max_length=50)

    def __unicode__(self):
        return self.first_name

    def get_last_name(self):
        return self.last_name

    def get_full_name(self):
        return (self.first_name + self.surname + self.last_name)

class House(models.Model):
    name = models.CharField(max_length=50)
    persons = models.ManyToManyField(Person)
    house_number = models.CharField(max_length=5)

    def __unicode__(self):
        return self.first_name

并且模型已在管理站点上注册。

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    pass

@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
    pass

对于模型Person,我希望管理员网站在模型的get_full_name()上显示方法__unicode__()而不是get_last_nameManyToManyField {1}}。

我该如何做到这一点?

感谢

2 个答案:

答案 0 :(得分:2)

要让PersonAdmin使用get_full_name,只需在list_display中使用get_full_name

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    list_display = ['get_full_name']

自定义人员在多个字段override the label_from_instance method中显示的方式。

from django.forms import ModelMultipleChoiceField

class PersonLastNameChoiceField(ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return obj.get_last_name

定义使用自定义字段的模型表单

class HouseForm(forms.ModelForm):
    persons = models.PersonLastNameChoiceField(Person.objects.all())

然后在模型管理员中使用模型表单。

@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
    form = HouseForm

答案 1 :(得分:1)

读取abount代理模型。代理模型的典型用例是通过更改其默认管理器或类方法来覆盖模型的Python行为。

class PersonAdmin(Person):
    class Meta:
        proxy = True
    def __unicode__(self):
        return self.get_full_name()

如需更多信息,请阅读:Multiple ModelAdmins/views for same model in Django admin