- Хранить ссылку на пользователя в вашей модели.
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 (новый экземпляр)). ,
Я получаю сообщение об ошибке 'qs = super (self, FilterUserAdmin) .queryset (request)'. Ошибка - это 'TypeError', и она говорит, что' должен быть типом, а не MyModelAdmin'. – Andy
Попробуйте заменить: 'qs = super (self, FilterUserAdmin) .queryset (request)' с: 'qs = admin.ModelAdmin.queryset (self, request)' – odedfos
@Andy 'super()' принимает класс перед 'self ', поэтому' super (FilterUserAdmin, self) 'является правильным способом. В Py3 вы можете полностью игнорировать аргументы 'super()'. –