我又有点迷失了。我是这方面的初学者。 我有两个模型:
class Person(models.Model):
name = models.CharField(max_length=200, default="Name")
phone = models.CharField(max_length=12, default="+22123456789")
...
class Adress(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
city = models.CharField(max_lenght=200, default="City")
...
在我的admin.py中,我将它们编辑为内联,因此在一个表单上我可以拥有所有人员数据和他的一些地址。这个很重要。我确实需要一个人与1-3个地址的关系。
from django.contrib import admin
from .models import Adress
from .models import Person
class AdressInline(admin.TabularInline):
model = Adress
class PersonAdmin(admin.ModelAdmin):
inlines = [
AdressInline
]
admin.site.register(Person, PersonAdmin)
现在......问题是无法使用两个模型中的字段创建list_display。根据我的理解列表 - 显示是平的,并且没有在哪里放置3个相同字段的值。我希望有一个如下所示的列表:
list_display = ('name', 'phone', 'city')
所以...我的想法是在模型中创建一个名为'maincity'的额外字段,用户无法编辑,但会根据Adress模型中的值自动填充。我们保存表格后。我在Django Docs中找到了类似的内容:
def save_model(self, request, obj, form, change):
obj.user = request.user
super(ArticleAdmin, self).save_model(request, obj, form, change)
如何告诉django将Adress.city分配给Person.maincity? *
*你可能会笑,我只是在学习。
答案 0 :(得分:1)
在人员和地址模型中保存城市值将导致数据重复。在设计模型或表格时,我们必须避免数据重复。
我们可以在 AddressAdmin list_display本身中显示Person和Address模型的值。
在AddressAdmin类中定义方法nick_name
,其中args为self and obj
。通过obj args,我们可以获取外键字段的值,并粘贴list_display中的方法名称。
#models.py
class Person(models.Model):
name = models.CharField(max_length=200)
nick_name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Address(models.Model):
name = models.ForeignKey(Person)
city = models.CharField(max_length=200)
def __str__(self):
return self.name
#admin.py
class AddressAdmin(admin.ModelAdmin):
list_display = ('nick_name', 'city')
def nick_name(self, obj):
return obj.name.nick_name