Как я могу перечислить имена групп, к которым принадлежит только аутентифицированный пользователь, при редактировании пользователя в админ-панели Django? - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь выяснить, как ограничить имена групп для администратора в Django.В системе есть две группы;"Школа первая" и Школа "Две".На рисунке ниже показаны пользователи, принадлежащие только к группе «Школа два» (включая меня как Джона Доу).

enter image description here

Например, если я нажимаюпользователь "Джош Доу", меня направляют на эту страницу: enter image description here

Мне нужно отобразить группы, к которым принадлежит только текущий аутентифицированный пользователь (Джон Доу).Таким образом, я могу назначить группу (или группы) для конкретного пользователя.Итак, здесь я хочу видеть только вариант «Школа два», так как я (Джон Доу) принадлежу только к этой группе (добавлено суперпользователем).

Как мне это сделать?

Позвольте мнеподелиться с вами моими исходными кодами: admin.py file

from django.contrib import admin
from .models import User
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .forms import UserAdminCreationForm, UserAdminChangeForm

class MyUserAdmin(BaseUserAdmin):
    form = UserAdminChangeForm
    add_form = UserAdminCreationForm

    list_display = ('email', 'first_name', 'last_name', 'is_staff', 'is_active', 'is_email_verified')

    def get_list_filter(self, request):
        if request.user.is_superuser:
            return ['groups']
        else:
            return ['is_staff', 'is_active', 'is_email_verified']

    readonly_fields = ('last_login', 'date_joined',)
    fieldsets = (
    (None, {'fields': ('email', 'password')}),
    ('Personal info', {'fields': ('first_name','last_name')}),
    ('Permissions', {'fields': ('is_active','is_staff', 'groups')}),
    ('Important dates', {'fields': ('last_login', 'date_joined')}),
)

    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('first_name','last_name','email', 'password1', 'password2', 'groups')}
         ),
    )
    search_fields = ('first_name', 'last_name', 'email',)
    ordering = ('email',)
    filter_horizontal = ()

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        qs = qs.filter(groups__id__in=request.user.groups.all())
        return qs

admin.site.register(User, MyUserAdmin)

В файле forms.py:

class UserAdminCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        User = get_user_model()
        model = User
        fields = ('email',)

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super(UserAdminCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        user.is_staff = True
        if commit:
            user.save()
        return user

class UserAdminChangeForm(forms.ModelForm):

  password = ReadOnlyPasswordHashField()

  class Meta:
     User = get_user_model()
     model = User
     fields = ('email', 'password', 'is_active','is_staff', 'groups')


  def clean_password(self):
          return self.initial["password"]

Буду рад, если кто-нибудь сможет помочь с перечислением только связанной группы(s) как указано выше.

1 Ответ

0 голосов
/ 18 октября 2018

Звучит так, будто вы хотите, чтобы это поле было доступно только для чтения сотрудникам без прав суперпользователя.Я думаю, что самый простой способ сделать это - использовать метод get_readonly_fields в классе ModelAdmin, чтобы сделать это поле доступным только для чтения в зависимости от того, кто редактирует.Как то так:

class MyUserAdmin(BaseUserAdmin):

    get_readonly_fields(self, request, obj=None):
        fields = super().get_readonly_fields(request, obj)
        if not request.user.is_superuser:
            fields = fields + ('groups',)
        return fields
...