Как в django добавить в админку возможность изменения одного поля из другого класса?

День добрый. Имеется такой класс:

class CustomerAdmin(admin.ModelAdmin):
    fields = ['user', 'address', 'phone']


И имеется такой:
class OrdersAdmin(admin.ModelAdmin):
    fields = ['customer', 'date', 'amount_bottle', 'price', 'statusOrder']
    list_filter = ['date']
    date_hierarchy = 'date'


Требуется из второго класса вывести поле address из первого класса. Как это сделать?

P.S. Модели связаны так:
class Customer(models.Model):
    user = models.ForeignKey(User)
    address = models.CharField(max_length=100)
    phone = models.IntegerField(max_length=11)

    def __unicode__(self):
        return self.user.first_name + ' ' + self.user.last_name


class Order(models.Model):
    customer = models.ForeignKey(Customer)
    date = models.DateTimeField()
    amount_bottle = models.IntegerField(default=0)
    price = models.IntegerField(default=0)
    statusOrder = models.CharField(max_length=15, default='booked')

    def __unicode__(self):
        return self.customer.user.first_name + ' ' + self.customer.user.last_name
  • Вопрос задан
  • 4979 просмотров
Пригласить эксперта
Ответы на вопрос 2
aruseni
@aruseni
Просто отобразить можно запросто:

class OrdersAdmin(admin.ModelAdmin):

    fields = [
        'customer',
        'customer_address',
        'date',
        'amount_bottle',
        'price',
        'statusOrder'
    ]
    readonly_fields = ['customer_address',]
    list_filter = ['date']
    date_hierarchy = 'date'

    def customer_address(self, obj):
        return obj.customer.address

    customer_address.short_description = "Customer’s address"

А вот с редактированием всё сложнее. Представьте себе, например, такую ситуацию — допустим, вы добавили в эту форму поле, которое сохраняется в поле address связанного объекта модели Customer. Но вот какое дело: пользователь в процессе редактирования поля поменял значение поля Customer, и поэтому объект Order связан уже с другим клиентом. Если всё равно сохранить адрес, то получится, что вы перезапишете значение уже для другого объекта, и это, возможно, будет неуместно. Если не сохранить — опять же, это может не быть ожидаемым поведением (может быть, пользователь хотел сохранить именно такой адрес для нового клиента).

Тут я вижу такие варианты решения: или запрещать редактирование клиента, или прятать поле с адресом, если клиент изенён, или вообще динамически (с помощью JS) подгружать новый адрес при изменении клиента (и блокировать сохранение заказа, пока адрес не подгрузился).

Если один из таких вариантов вам подходит, то вам нужно отредактировать используемую для страницы редактирования заказа форму, и дополнить обработку этой формы таким образом, чтобы значение поля с адресом сохранялось в поле address связанного объекта Customer.

Удачи!

P.S. Замечание по стилю: лучше не OrdersAdmin, а OrderAdmin (тем более, что Customer у вас напиано в единственном числе).
Ответ написан
Комментировать
Скорее всего вам нужен InlineModelAdmin
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы