Django models 为一对多关系提供更好的Django UI

Django models 为一对多关系提供更好的Django UI,django-models,django-admin,Django Models,Django Admin,首先 我喜欢Django,我喜欢它,因为只需几行描述模型,我就得到了完整的CURD web应用程序。 现在我有一个应用程序,需要一对多的关系,它不是工作,因为我期待 我的问题基于: 这是我的代码: 型号.py from django.db import models class Dude(models.Model): name = models.CharField(blank=False, null=False, max_length=100, unique=True) de

首先
我喜欢Django,我喜欢它,因为只需几行描述模型,我就得到了完整的CURD web应用程序。
现在我有一个应用程序,需要一对多的关系,它不是工作,因为我期待

我的问题基于:

这是我的代码:

型号.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)
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)
admin.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)
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,对于同一Dude的每个号码,我需要添加新行(并一次又一次地选择同一Dude)

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

怎么做?
是否可以只编辑admin.py,或者我需要为此编写自己的视图?

如果我需要为此写我自己的观点,请给出一些指导方针如何做

您可以使用
InlineAdmin

class DudeAdmin(admin.ModelAdmin):
    list_display  = ('name', 'list_phones')
在你的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)
这将在
Dude
记录下显示所有相关的
PhoneNumber
记录,您可以添加新记录、更新或删除现有记录。这都是在一个单一的页面,因为你想。在这种方法中,您不需要直接向管理员添加
PhoneNumber

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

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')

您可以使用在
模型下定义的方法,就像使用模型字段一样

您可以使用
InlineAdmin

class DudeAdmin(admin.ModelAdmin):
    list_display  = ('name', 'list_phones')
在你的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)
这将在
Dude
记录下显示所有相关的
PhoneNumber
记录,您可以添加新记录、更新或删除现有记录。这都是在一个单一的页面,因为你想。在这种方法中,您不需要直接向管理员添加
PhoneNumber

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

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')

您可以使用在
模型下定义的方法,就像使用模型字段一样

为此,您可以使用
内联模型
。它们正是您所需要的。您可以为此使用
内联模型。它们正是您所需要的。还有一件事,是否可以添加内联线=[PhoneNumberInline],以某种方式列出Dude的显示=('name',),以便我可以看到每个Dude的所有电话。或者至少有多少部手机,或者前N部手机?谢谢,我将继续这个问题。也许你能再帮我一次?谢谢,还有一件事,是否可以添加内联线=[PhoneNumberInline],以某种方式列出Dude的显示=('name',),这样我就可以看到每个Dude的所有电话。或者至少有多少部手机,或者前N部手机?谢谢,我将继续这个问题。也许你能再帮我一次?谢谢