2012-03-05 6 views
4

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

Спасибо

ответ

12
  • Хранить ссылку на пользователя в вашей модели.

models.py:

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

class MyModel(models.Model): 
    user = models.ForeignKey(User) 
    ... (your fields) ... 
  • Force текущего пользователя будет храниться в этой области (при использовании администратора)
  • Force любого списка этих объектов, чтобы быть (дополнительно) фильтруется текущий пользователь (при использовании администратора)
  • Запретить другим пользователям редактировать (хотя они не могут видеть объект в списке, к которому они могут получить доступ к его 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(), чтобы ваше редактирование не установило пользователя и, таким образом, «отняло» объект у предыдущего пользователя (например, только установить пользователя, если self.user - None (новый экземпляр)). ,

+1

Я получаю сообщение об ошибке 'qs = super (self, FilterUserAdmin) .queryset (request)'. Ошибка - это 'TypeError', и она говорит, что' должен быть типом, а не MyModelAdmin'. – Andy

+0

Попробуйте заменить: 'qs = super (self, FilterUserAdmin) .queryset (request)' с: 'qs = admin.ModelAdmin.queryset (self, request)' – odedfos

+0

@Andy 'super()' принимает класс перед 'self ', поэтому' super (FilterUserAdmin, self) 'является правильным способом. В Py3 вы можете полностью игнорировать аргументы 'super()'. –

1

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

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