Список связанных полей в Django ModelAdmin - PullRequest
6 голосов
/ 15 апреля 2011

Я перечисляю модель в админке Django через TabularInline.Внутри этой строки я хотел бы использовать синтаксис обхода модели Django для перечисления данных в других моделях, на которые ссылается модель, через внешние ключи.Например,

class MyRelatedModel(models.Model)
    name = models.CharField(max_length=50)
    created = models.DateField(auto_now_add=True)
    other = models.ForeignKey('MyOtherRelatedModel')

class MyOtherRelatedModel(models.Model)
    name = models.CharField(max_length=50)
    created = models.DateField(auto_now_add=True)

class MyRelatedModelInline(admin.TabularInline):
    model = MyRelatedModel
    fields = ['name', 'created', 'other__name']
    #readonly_fields = ['name', 'created', 'other__name']

Однако использование «other__name» приводит к ошибке ImproperlyConfigured:

'MyRelatedModelInline.fields' refers to field 'other__name' that is missing from the form

Не поддерживается ли синтаксис обхода модели в экземплярах ModelAdmin?Если это поддерживается, что я делаю не так?

РЕДАКТИРОВАТЬ: Если я раскомментирую readonly_fields, ошибка становится:

Caught AttributeError while rendering: 'MyMainModelAdmin' object has no attribute '__name__'

1 Ответ

16 голосов
/ 16 апреля 2011

В соответствии с предложением Роузмана, приведенным выше, вы можете отображать связанные данные (один-к-одному или многие-к-одному) только для чтения с помощью встроенных моделей администрирования. Вот небольшой пример, просто чтобы убедиться, что мы все на одной странице. Ниже вы можете увидеть, что есть три способа достижения вашей цели (если я правильно понимаю эту цель).

models.py:

class Company(models.Model):
    name = models.CharField(max_length=50)

class Employee(models.Model):
    name = models.CharField(max_length=50)
    company = models.ForeignKey('Company')
    car = models.ForeignKey('Car')

    def model_callable(self):
        return self.car.rego

class Car(models.Model):
    rego = models.CharField(max_length=50)

admin.py:

def unbound_callable(emp):
    return emp.car.rego

class EmployeeInline(admin.TabularInline):
    model = Employee
    fields = ('name', 'model_callable', 'model_admin_callable', unbound_callable)
    readonly_fields = ('model_callable', 'model_admin_callable', unbound_callable)

    def model_admin_callable(self, emp):
        return emp.car.rego

class CompanyAdmin(admin.ModelAdmin):
    model = Company
    inlines = (EmployeeInline,)

admin.site.register(Company, CompanyAdmin)

Как вы можете видеть, readonly_fields обрабатывается так же, как list_display, как указано в документации Django для contrib.admin (начиная с версии 1.2).

В приведенном выше примере, когда вы редактируете Компанию, вы увидите, что ее сотрудники находятся внутри. В каждой строке будет указано имя сотрудника в редактируемом текстовом поле, а рядом с именем вы увидите только текст, предназначенный для чтения автомобиля сотрудника (emp.car.rego).

Обращаясь к исходному вопросу, вы хотели ссылаться на связанные данные как «other__name». Это не сработает. Выражения типа other__name или car__rego имеют особое значение только в качестве аргументов ключевых слов в фильтрах при выполнении запросов Django. Например, при получении сотрудника, у которого есть автомобиль с определенным номером рего:

Employee.objects.filter(car__rego='111')

Надеюсь, это поможет.

J

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