Django自动为admin

时间:2017-01-13 10:18:45

标签: django django-models django-admin

我又有点迷失了。我是这方面的初学者。 我有两个模型:

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? *

*你可能会笑,我只是在学习。

1 个答案:

答案 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