Django admin, как добавить набор запросов в качестве связанного свойства поля только для чтения - PullRequest
0 голосов
/ 17 марта 2020

Вот как выглядит мой класс администратора:

@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
    readonly_fields = ('associated_risks',)

associated_risks - это свойство набора запросов, которое я установил в модели следующим образом:

@property
def associated_risks(self):
    return Risk.objects.filter(control__project__associated_controls__in=self.associated_controls.all())

что страница администратора это поле только для чтения, показанное так:

enter image description here

Можно ли установить его как поле m2m, аналогичное тому, как другие m2m поля на странице администратора django настроены? (форма множественного выбора)

1 Ответ

0 голосов
/ 18 марта 2020

Если вы настроили метод __str__ для своей модели Risk, набор запросов будет отображать любое представление, которое вы выберете вместо Risk: AM.Risk1, поэтому, если в вашей модели Risk у вас было поле с именем name, Ваш __str__ метод может быть:

class Risk(Model):
    name = Charfield()
    ...


    def __str__(self):
        return self.name

Тогда в админе результаты будут выглядеть как <Queryset [<Risk: name1>, <Risk: name2> ... ], но django будет автоматически обрезать это, если оно станет слишком длинным. Если это по-прежнему не то, что вам нужно, в качестве альтернативы можно написать еще одну функцию для модели, которая просто предоставляет список имен рисков, разделенных запятыми, для этой единственной цели.

так:

@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
    readonly_fields = ('associated_risks_list',)

и

def associated_risks_list(self):
    str = ""
    for risk in self.associated_risks:
        str += f"{risk.name}, "
    return str[:-2] # to trim the last comma and whitespace

В администраторе будет показан список, доступный только для чтения через запятую

...