Фильтрация в представлении администратора модели
В вашем классе ModelAdmin вы должны определить get_queryset
, чтобы отфильтровать элементы, отображаемые в представлении списка, в соответствии с вашими потребностями.
Однако он не будет отображать элементы, но пользователь все равно сможет получить доступ к другим элементам, изменив URL. Чтобы предотвратить это, вам нужно определить permission_helper_class
и установить user_can_inspect
, user_can_create
, user_can_edit
и user_can_delete
методы для возврата True / False соответственно.
Назначение пользователя для созданного объекта
Исходя из вашего комментария ниже, давайте предположим, что у вас есть следующее определение модели:
from django.conf import settings
from django.db import models
class FamilyTree(models.Model):
managed_by = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False)
# Some other fields.
Обратите внимание, что null=False
не удастся, если у вас уже есть некоторые записи в базе данных. Если это так, вам придется создать пользовательских миграций .
Чтобы назначить пользователя, создающего объект с самим объектом, вам нужно переопределить CreateView
администратора модели с пользовательским.
from django.forms.widgets import HiddenInput
from wagtail.contrib.modeladmin.views import CreateView
class FamilyTreeCreateView(CreateView):
def get_form(self):
form = super().get_form()
form.fields['managed_by'].widget = HiddenInput()
return form
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['data']['managed_by'] = self.request.user # Add the data so the form validates properly.
return kwargs
Обратите внимание, что таким образом он выведет скрытое поле формы managed_by
, которое впоследствии будет установлено на правильное значение. Если это проблема для вас, вам нужно исключить поле и затем перезаписать метод form_valid
. Я решил не делать этого, потому что вам придется полностью перезаписать метод (и опыт показывает, что данное обновление Wagtail будет отличаться от вашей скопированной реализации, и вы этого не заметите), а не просто переопределить / расширить его, так как первоначальный вызов метода form.save()
который потерпит неудачу, так как обязательное поле managed_by
отсутствует.
А затем установите это представление на вашей модели admin:
from wagtail.contrib.modeladmin.options import ModelAdmin
from myviews import FamilyTreeCreateView
class FamilyTreeAdmin(ModelAdmin):
create_view_class = FamilyTreeCreateView