Я хочу, чтобы пользователи-администраторы видели только экземпляры модели, которые они создали. Я следовал этим инструкциям Filter django admin by logged in userФильтр django admin зарегистрированным пользователем (отображается внешний ключ)
class FilterUserAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if getattr(obj, 'user', None) is None: #Assign user only the first time, superusers can edit without changing user
obj.user = request.user
obj.save()
def queryset(self, request):
qs = super(FilterUserAdmin, self).queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(user=request.user)
def has_change_permission(self, request, obj=None):
if not obj:
# the changelist itself
print('query change')
return True # So they can see the change list page
return obj.user == request.user or request.user.is_superuser
class CampaignAdmin(FilterUserAdmin):
...
Как выглядит мой код. Все работает нормально. Мне нужна еще одна модель с кампанией в качестве внешнего ключа.
class ScreenAdmin(FilterUserAdmin):
...
admin.site.register(Campaign,CampaignAdmin)
admin.site.register(Screen,ScreenAdmin)
теперь, когда я иду на экраны, и я вижу, кампании, созданные другими пользователями, чтобы выбрать из
Я не хочу кампании от других пользователей, чтобы иметь возможность выбрать
Update: Это мой текущий get_form
class ScreenAdmin(FilterUserAdmin):
list_display = ('screen_name', 'id','screen_URL')
def get_form(self, request, obj=None, **kwargs):
self.exclude = ["beacon"]
if not request.user.is_superuser:
self.exclude.append('user') #here!
form = super(ScreenAdmin, self).get_form(request, obj, **kwargs)
#print(vars(form))
form.base_fields['campaign'].queryset = Campaign.objects.filter(user=request.user)
return form
def changelist_view(self, request, extra_context=None):
if request.user.is_superuser:
self.list_display = ('screen_name','user', 'id','screen_URL')
#print('Change List######')
return super(ScreenAdmin, self).changelist_view(request, extra_context)
Это намеренно. Я вижу то же поведение, что и персонал, а не суперпользователь, что является проблемой. –