我有两个型号,
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_name
和ManyToManyField
{1}}。
我该如何做到这一点?
感谢
答案 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