Фильтр django admin по зарегистрированному пользователю - PullRequest
4 голосов
/ 06 марта 2012

Я новичок в Джанго. Я создаю простое приложение, в котором пользователи вводят некоторые данные и просматривают их позже. Мне нужно, чтобы администратор django показывал пользователю только те данные, которые она вводит, а не данные других пользователей. Можно ли заменить его на несколько страниц администратора?

Спасибо

Ответы [ 2 ]

15 голосов
/ 06 марта 2012
  • Сохраните ссылку на пользователя в вашей модели.

models.py:

from django.db import models
from django.contrib.auth.models import User

class MyModel(models.Model):
    user = models.ForeignKey(User)
    ... (your fields) ...
  • Принудительно сохранить текущего пользователя в этом поле (при использовании admin)
  • Принудительно (дополнительно) фильтровать любой список этих объектов текущим пользователем (при использовании администратора)
  • Запретить другим пользователям редактирование (даже если они не видят объект в списке, они могут напрямую обращаться к его change_form)

admin.py:

from django.contrib import admin
from models import MyModel

class FilterUserAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change):
        obj.user = request.user
        obj.save()

    def get_queryset(self, request): 
        # For Django < 1.6, override queryset instead of get_queryset
        qs = super(FilterUserAdmin, self).get_queryset(request) 
        return qs.filter(created_by=request.user)

    def has_change_permission(self, request, obj=None):
        if not obj:
            # the changelist itself
            return True
        return obj.user === request.user

class MyModelAdmin(FilterUserAdmin):
    pass   # (replace this with anything else you need)
admin.site.register(MyModel, MyModelAdmin)

Если у вас есть MyOtherModel с внешним ключом «пользователь», просто подкласс MyOtherModelAdmin из FilterUserAdmin таким же образом.

Если вы хотите, чтобы определенные суперпользователи могли что-либо видеть, настройте queryset () и has_change_permission () соответственно вашим собственным требованиям (например, не фильтруйте / запрещайте редактирование, если request.user.username == 'me'). В этом случае вы также должны настроить save_model () так, чтобы ваше редактирование не устанавливало пользователя и, таким образом, «забирало» объект у предыдущего пользователя (например, устанавливайте user, если self.user имеет значение None (новый экземпляр)).

1 голос
/ 06 марта 2012

Вам нужно будет сохранить пользователя для каждого элемента и запросить каждый элемент с этим пользователем в качестве критерия поиска.Вы, вероятно, создадите базовую модель, от которой будут наследоваться все остальные ваши модели.Для начала взгляните на разрешения на уровне строк в admin .

...