2016-05-25 2 views
1

Я хочу, чтобы пользователи-администраторы видели только экземпляры модели, которые они создали. Я следовал этим инструкциям 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) 

ответ

0

это решение идеально s ane и working

def queryset(self, request): 
    qs = super(FilterUserAdmin, self).queryset(request) 
    if request.user.is_superuser: 
     return qs 
    return qs.filter(user=request.user) 

Если вы не отмечены как суперпользователь, это, вероятно, то, что вы делаете.

иметь доступ к интерфейсу администратора, необходимо проверить пользователь, как «персонал» (is_staff)

если вы проверяете «суперпользователь» вы будете видеть все данные, таким образом, создать другой пользователь (для тестов) добавьте ему правильные права, но не отмечайте mim как суперпользователь, только is_staff и проверьте его.

+0

Это намеренно. Я вижу то же поведение, что и персонал, а не суперпользователь, что является проблемой. –

Смежные вопросы