简体   繁体   中英

Filter django admin by logged in user (Foreign Key showing up)

I want the admin users to see only the model instances they created. I followed these instructions Filter django admin by logged in user

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):
   ...

This is how my code looks like. Everything works fine. I need one more model with campaign as foreign key.

class ScreenAdmin(FilterUserAdmin):
   ...

admin.site.register(Campaign,CampaignAdmin)
admin.site.register(Screen,ScreenAdmin)

now when I go to screens, and I see campaigns created by other users to select from

I don't want campaigns from other users to be able to be selected

Update : This is my current 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)

this solution is perfectly sane and working

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

unless you are marked as superuser, an this is probably what you do.

to have access to the admin interface, you must check user as "staff" (is_staff)

if you check "superuser" you will see all of the data, so create other user (for the tests) add him proper rights, but do not mark mim as superuser, only is_staff and test it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM