Как правильно request.user.is_superuser внутри функции в django admin.py
Я изучаю Djnago и
У меня есть функция в admin.py, которая подсчитывает количество участников в активности, она работает нормально, пока я не захотел узнать, является ли текущий пользователь суперпользователем и добавил request
внутри def set_count(self, request, obj)
, ожидая сделать запрос на пользователя. Поскольку я получаю ошибку, это означает, что это не то, как это сделать и неправильно. Как это исправить? Спасибо.
Ниже то, что я хочу сделать, оценить user.is_superuser
если true, то отобразит в list_display
ссылку на participants_changelist
иначе, отобразит простой текст.
def get_queryset(self, request):
queryset = super().get_queryset(request)
queryset = queryset.annotate(set_count=Count('activity_activity'))
return queryset
def set_count(self, request, obj):
counter = obj.set_count
if request.user.is_superuser:
url = (
reverse("admin:activity_announcements_participants_changelist")
+ "?"
+ urlencode({"activity__id": f"{obj.id}"})
)
return format_html('<a href="{}">{} Paticipants</a>', url, counter)
else:
counter = obj.set_count
return format_html('{} Paticipants', counter)
set_count.short_description = "No. of Paticipants"
Ошибка:
TypeError at /admin/activity_announcements/activity/
ActivityAdmin.set_count() missing 1 required positional argument: 'obj'
Request Method: GET
Request URL: http://localhost:8000/admin/activity_announcements/activity/
Django Version: 4.1.5
Exception Type: TypeError
Exception Value:
ActivityAdmin.set_count() missing 1 required positional argument: 'obj'
Exception Location: /py/lib/python3.11/site-packages/django/contrib/admin/utils.py, line 280, in lookup_field
Raised during: reversion.admin.changelist_view
Python Executable: /py/bin/python
Python Version: 3.11.1
Python Path:
['/app',
'/usr/local/lib/python311.zip',
'/usr/local/lib/python3.11',
'/usr/local/lib/python3.11/lib-dynload',
'/py/lib/python3.11/site-packages',
'/py/lib/python3.11/site-packages/odf',
'/py/lib/python3.11/site-packages/odf',
'/py/lib/python3.11/site-packages/odf',
'/py/lib/python3.11/site-packages/odf',
'/py/lib/python3.11/site-packages/odf',
'/py/lib/python3.11/site-packages/odf',
'/py/lib/python3.11/site-packages/odf']
Server time: Sun, 22 Jan 2023 03:06:22 +0800
Проблема в том, что при определении пользовательского поля для списка в админке, у вас нет доступа к запросу. Определение функции должно выглядеть следующим образом def your_field(self, obj):
. Чтобы получить запрос в определении поля, вы можете сделать следующее:
class YourAdmin(admin.modeladmin):
def get_queryset(self, request):
self.request = request
return super().get_queryset(request)
def set_count(self, obj):
counter = obj.set_count
if self.request.user.is_superuser:
url = (
reverse(
"admin:activity_announcements_participants_changelist")
+ "?"
+ urlencode({"activity__id": f"{obj.id}"})
)
return format_html('<a href="{}">{} Participants</a>', url, counter)
else:
counter = obj.set_count
return format_html('{} Participants', counter)
set_count.short_description = "No. of Paticipants"