更好的Django UI用于一对多的关系

时间:2013-11-30 11:30:02

标签: django-models django-admin

第一
我喜欢Django,我喜欢它,因为只有几行描述模型我得到完整的CURD网络应用程序 现在我正在使用需要一对多关系的应用程序,但它无法正常工作。

我的问题基于:How to express a One-To-Many relationship in Django

所以这是我的代码:

models.py

from django.db import models

class Dude(models.Model):
    name = models.CharField(blank=False, null=False, max_length=100, unique=True)

    def __unicode__(self):
            return u"%s" % self.name

class PhoneNumber(models.Model):
    dude   = models.ForeignKey(Dude)
    number = models.CharField(blank=False, null=False, max_length=100, unique=True)

admin.py

from django.contrib import admin

from TestingDjango.apps.one_to_many.models import Dude, PhoneNumber

class DudeAdmin(admin.ModelAdmin):
    pass
    list_display  = ('name',)

class PhoneNumberAdmin(admin.ModelAdmin):
    pass
    list_display  = ('dude', 'number')

admin.site.register(Dude, DudeAdmin)
admin.site.register(PhoneNumber, PhoneNumberAdmin)

当我操作管理员web UI时,我需要添加Dude,然后我需要去PhoneNumber,对于同一个家伙的每个号码我需要添加新行(并一次又一次选择相同的家伙)。

我期待的是: - 当我加入新的家伙时,在同一页面中,我将有“+”按钮,我可以为一个家伙添加多个号码。然后点击保存。当我看到伙计时,我会看到那个家伙的所有号码,现在我需要去PhoneNumber查看每个人的所有号码。

怎么做?
是否可以只编辑admin.py或我需要编写自己的视图?
如果我需要为此撰写自己的观点,请提供一些指导如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以使用InlineAdmin

在您的admin.py

class PhoneNumberInline(admin.TabularInline):
    model = PhoneNumber   # related model
    extra = 1  # number of new record fields

class DudeAdmin(admin.ModelAdmin):
    inlines = [PhoneNumberInline, ]

admin.site.register(Dude, DudeAdmin)

这将显示PhoneNumber记录下的所有相关Dude记录,您可以添加新记录或更新或删除现有记录。这就是你想要的单页。 Documentation is here。在此方法中,您无需直接向管理员添加PhoneNumber

更新:您可以查看相关的电话号码或记录的电话号码。首先,您必须定义一种方法,将电话号码(或电话号码)返回到Model

class Dude(models.Model):
    name = models.CharField(blank=False, null=False, max_length=100, unique=True)

def list_phones(self):
    phone_numbers = self.phonenumber_set.values_list('number', flat=True)  # use reverse relation to get a list ofall recorded numbers
    phone_count = self.phonenumber_set.count()
    return "This user have %s numbers recorded: %s" % (phone_count, ', '.join(phone_numbers))

def __unicode__(self):
        return u"%s" % self.name

ModelAdmin

class DudeAdmin(admin.ModelAdmin):
    list_display  = ('name', 'list_phones')

您可以使用Model下定义的方法作为模型字段。

相关问题