Обратные строки в Django Admin с более чем одной моделью - PullRequest
8 голосов
/ 22 декабря 2011

Скажем, у меня есть некоторые модели django, что-то вроде этого:

class Address(models.Model):
    pass

class Person(models.Model):
    address = models.ForeignKey(Address)

class Store(models.Model):
    address = models.ForeignKey(Address)

class Company(models.Model):
    address = models.ForeignKey(Address)

Итак, в интерфейсе администратора я хотел бы иметь возможность редактировать человека и иметь адрес в строке.

Я знаю, что это можно сделать,

class Address(models.Model):
    person  = models.ForeignKey(Person, blank=True)
    store   = models.ForeignKey(Store, blank=True)
    company = models.ForeignKey(Company, blank=True)

class Person(models.Model):
    pass

class Store(models.Model):
    pass

class Company(models.Model):
    pass

Тогда я могу сделать обычное,

class AddressInline(admin.TabularInline):
    model = Address

class PersonAdmin(admin.ModelAdmin):
    model = Person
    inlines = (AddressInLine,)

class CompanyAdmin(admin.ModelAdmin):
    and so on

Но тогда это означает, что у меня будет больше, чемодин адрес на человека, и моя модель адресов больше не подходит.

Буду признателен за любую помощь.

Ответы [ 2 ]

6 голосов
/ 22 декабря 2011

Попробуйте следующее

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Address(models.Model):
    object_id    = models.PositiveIntegerField()
    content_type = models.ForeignKey(ContentType)
    of           = generic.GenericForeignKey('content_type', 'object_id' )

class Person(models.Model):
    pass

class Store(models.Model):
    pass

class Company(models.Model):
    pass

Тогда вы можете сделать это:

from django.contrib import admin
from django.contrib.contenttypes import generic

class AddressInline(generic.GenericStackedInline):
    model   = Address
    max_num = 1

class PersonAdmin(admin.ModelAdmin):
    model = Person
    inlines = (AddressInLine,)

class CompanyAdmin(admin.ModelAdmin):
    and so on

admin.site.register(Person, PersonAdmin)
3 голосов
/ 22 декабря 2011

Изменение класса AddressInline (admin.TabularInline) на класс AddressInline (admin.StackedInline) сделает адрес Inline менее похожим на несколько возможных.

Установите AddressInline.max_num равным 1, если вы не хотите большечем 1 адрес на AddressInline.

Установите AddressInline.extra равным 1, если вы хотите пустую форму адреса, когда нет связанного адреса.

Документация: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-options

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...