Python Django 1.5:在两个管理模型中显示foreignkey值

Python Django 1.5:在两个管理模型中显示foreignkey值,python,django,python-2.7,django-models,django-admin,Python,Django,Python 2.7,Django Models,Django Admin,我不确定我的头衔是否有意义。基本上(根据下面的代码),当我访问管理屏幕时,我希望一个项目与其客户端一起显示,一个客户端显示所有附加的项目。有没有办法做到这一点 class Client(models.Model): title = models.CharField(max_length=250, null=True) #project = models.ManyToManyField(Project) #status = models.CharField(max_len

我不确定我的头衔是否有意义。基本上(根据下面的代码),当我访问管理屏幕时,我希望一个项目与其客户端一起显示,一个客户端显示所有附加的项目。有没有办法做到这一点

class Client(models.Model):
    title = models.CharField(max_length=250, null=True)

    #project = models.ManyToManyField(Project)
    #status = models.CharField(max_length=250)

class Project(models.Model):
    project_choices = (
        ('L1', 'Lead'),
        ('C1', 'Confirmed'),
        ('P1', 'In Progress'),
        ('P1', 'Paid'),

    )
    title = models.CharField(verbose_name='Project Title', max_length=250, null=True)
    client = models.ForeignKey(Client)
    project_status = models.CharField(max_length=2,
                                      choices=project_choices,
                                      default='P1')
    def __unicode__(self):
        return self.title

您需要为模型创建ModelAdmin类,以定义要在内置Django admin中显示的列:

这一点特别重要:

ManyToManyField fields aren’t supported, because that would entail executing a separate SQL statement for each row in the table. If you want to do this nonetheless, give your model a custom method, and add that method’s name to list_display. (See below for more on custom methods in list_display.)
因此,您可以为您的客户机创建一个加载客户机项目的方法,并将该方法包含在
列表\u display

像这样的事情应该会让你走上正确的轨道:

# In your models.py...
from django.contrib import admin

class Client(models.Model):
    title = models.CharField(max_length=250, null=True)

    def projects(self):
        return Project.objects.filter(client=self)


class ClientAdmin(models.ModelAdmin):
    list_display = ('title','projects',)
admin.site.register(Client,ClientAdmin)

我建议您设置一个自定义设置,并使用列表显示来指示要在管理中显示的字段。它是相当可定制的,并且您可以添加可调用项来精确显示您所指示的信息。下面是客户机模型的ModelAdmin示例

# project/app/admin.py
# Callable to add to ModelAdmin List Display
def show_client_projects(obj):
    project_list = [p.title for p in obj.project_set.all()]
    return ', '.join(project_list)
show_client_projects.short_description = 'Client Projects'

# Custom ModelAdmin
class ClientAdmin(admin.ModelAdmin):
    list_display = ('title', 'show_client_projects')