Как отобразить в django admin данные только для чтения из другой модели? - PullRequest
1 голос
/ 22 января 2020

Почему, когда я вызываю экземпляр модели из метода car_name, метод возвращает - в Django admin.

@admin.register(Invoice)
class CarProductDataAdmin(admin.ModelAdmin):
    form = CarProductDataAdminForm

    def car_name(self, obj):
        # Call this instance 
        car = Customer.objects.get(product__customer_id=self.request.user.person.id)
        return "car.name"  # return string

    readonly_fields = ('car_name', )

Но когда я просто возвращаю строку, это работа.

@admin.register(Invoice)
class CarProductDataAdmin(admin.ModelAdmin):
    form = CarProductDataAdminForm

    def car_name(self, obj):
        # Doesn`t Call this instance 
        # return string
        return "name"

    readonly_fields = ('car_name', )

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Первая заметная проблема в вашем коде заключается в том, что вместо значения атрибута объекта вы возвращаете строку:

return "car.name"  # return string

должно быть:

return f"{car.name}"

или, в зависимости от python версия, которую вы используете:

return f"{}".format(car.name)

Далее следует, что вызов get в диспетчере моделей должен вызвать исключение DoesNotExists, но в некоторых ситуациях его можно отключить, поэтому я советую изменить код на:

try:
    car = Customer.objects.get(product__customer_id=self.request.user.person.id)
    return f"{car.name}" 
except Customer.DoesNotExists:
    return "None"

И посмотрите, вернет ли это то, что вы хотите, или "Нет"

0 голосов
/ 22 января 2020

По моему мнению, администратор django, похоже, молча терпит неудачу при обнаружении исключения в методе, который используется в качестве поля.

В вашем первом примере проблема, похоже, self.request, так как экземпляр CarProductDataAdmin не имеет атрибута request. Таким образом, вместо того, чтобы вызывать исключение, никакое значение не возвращается в поле, что приводит к выводу «-».

Если вам нужен request, вы должны получить его где-то и сохранить в своем ModelAdmin для повторного использования. -использование. Возможно, переопределив метод get_form ModelAdmin

class CarProductDataAdmin(admin.ModelAdmin):

# ....

    def get_form(self, request, obj=None, change=False, **kwargs):
        self.request = request
        return super().get_form(request, obj, change, **kwargs)

Тогда вы сможете использовать метод car_name, как указано в вашем коде.

...