Как добавить страницу профиля в бэкэнд Django 2.0 для сотрудников? - PullRequest
0 голосов
/ 07 мая 2019

Я занимался серфингом в Интернете, пытаясь найти что-то подобное, но я нахожу только внешние решения или устаревшие руководства.Я хочу позволить штатным пользователям редактировать некоторую информацию по умолчанию, такую ​​как имя, фамилия, электронная почта, а также другую дополнительную информацию, такую ​​как биография, телефон и т. Д. Я создал класс Профиль с отношением OneToOneField к Пользователь как предложено здесь но таким образом только суперпользователь может редактировать эту информацию.Если я даю разрешение can_change_user на группу персонала, то каждый пользователь "staff" может редактировать любой профиль.

edit это файлы моего приложения с именем users

# admin.py - пользователи

class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False
    verbose_name_plural = 'Profile'
    fk_name = 'user'

class CustomUserAdmin(UserAdmin):
    inlines = (ProfileInline, )

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(CustomUserAdmin, self).get_inline_instances(request, obj)


admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)  

# models.py - пользователи

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    extra_info = models.CharField(max_length=30, blank=True)    

@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save() 

РЕДАКТИРОВАТЬ 1: Я отредактировал два класса таким образом

class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False
    verbose_name_plural = 'Profilo'
    fk_name = 'user'

    def has_change_permission(self, request, obj=None):
        print("utente:")
        print(request.user)
        if obj == request.user:
            return True
        else:
            return False    


class CustomUserAdmin(UserAdmin):
    inlines = (ProfileInline, )

    # this function prints error *"get_queryset() missing 1 required positional argument: 'request'"*  
    '''
    def get_queryset(self, request):
        queryset = super(CustomUserAdmin, self).get_queryset()
        queryset = queryset.filter(user=self.request.user)
        return queryset
    '''

    def get_fieldsets(self, request, obj=None):
        if not request.user.is_superuser:
            if obj == request.user:
                fieldsets = (
                (('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
                )
            else:
                fieldsets = ()
        else:
            fieldsets = self.fieldsets

        return fieldsets


    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(CustomUserAdmin, self).get_inline_instances(request, obj)


admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)  

, почему появляется "# 1", пока пользователь не заполнит поле?#1 is is shown until the user fills in the field

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...