django AbstractUser: Как правильно написать страницу профиля пользователя - PullRequest
0 голосов
/ 23 марта 2019

Я использую AbtractUser, чтобы расширить пользовательскую модель, как описано в https://wsvincent.com/django-custom-user-model-tutorial/

И, поскольку я хочу, чтобы не имеющий персонала пользователь мог выполнять некоторые ограниченные действия администратора, я следовал https://tryolabs.com/blog/2012/06/18/django-administration-interface-for-non-staff-users/

он работает, как и ожидалось

В настоящее время мой результат опубликован на http://oi65.tinypic.com/25kuale.jpg

Как видно из рисунка, пользователь, не являющийся сотрудником, у которого есть разрешение «изменение модели пользователя», имеет «Пользователи» в разделе «Приложение Radius».меню.Мой вопрос: как добавить «MyProfile» в «верхнем меню» (то же самое место, что и «Смена пароля», которое при нажатии вызовет форму изменения пользователя (изображена справа)?

в models.py

class RadiusUser(AbstractUser) :
    radius_password = models.CharField(max_length=40, verbose_name="Hotspot Password", 
        help_text='Password for Accessing Our Network/Hotspot',blank=True, null=True)
    enable = models.BooleanField(default=False)
    gb_all = models.FloatField(default=0.0)
    gb_day = models.FloatField(default=0.0)
    gb_night = models.FloatField(default=0.0)
    expired_date = models.DateTimeField(auto_now_add=True)
    is_partner = models.BooleanField(default=False)
    can_add_credit = models.BooleanField(default=False)
    balance = models.IntegerField(blank=False, default=0)
    def __str__(self):
        return self.username

в admin.py

class RadiusUserAdmin(UserAdmin):
    add_form = RadiusUserCreationForm
    form = RadiusUserChangeForm
    model = RadiusUser
    list_display = ['username']
    radius_basic_fieldset = ('Radius Configs', {'classes': ('wide',),
        'fields': ('radius_password','gb_all','gb_day','gb_night','balance')})
    radius_permission_fieldset = ('Radius Permission', {'classes': ('wide',),
        'fields': ('enable','is_partner','can_add_credit')})

    def get_queryset(self, request):
        print('REQUEST=', str(request))
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(pk=request.user.pk)

    def get_fieldsets(self, request,obj):
        print('OBJECT',obj)
        if not obj:
            return self.add_fieldsets

        if request.user.is_superuser:
            fieldsets = UserAdmin.fieldsets + (self.radius_basic_fieldset, self.radius_permission_fieldset)
        else :
            fieldsets = ((None,{'fields':('username','password')}),
              self.radius_basic_fieldset)

        print('FIELDSETS:', fieldsets)
        return fieldsets

    def get_readonly_fields(self, request,obj):
        if request.user.is_superuser:
            return (None,)
        return ('username',
            'enable', 'gb_all', 'gb_day', 'gb_night', 'balance')


admin.site.register(RadiusUser, RadiusUserAdmin)
nostaff_admin_site.register(RadiusUser, RadiusUserAdmin)

в forms.py

class RadiusUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm):
        model = RadiusUser
        fields = ('username', 'password', 'radius_password')

class RadiusUserChangeForm(UserChangeForm):
    #disabled_fields=['username','enable','gb_all','gb_day','gb_night','expired_date']
    class Meta:
        model = RadiusUser
        fields = ['username','password','radius_password','enable','gb_all','gb_day','gb_night']

    def __init__(self, *args, **kwargs):
        super(RadiusUserChangeForm, self).__init__(*args, **kwargs)

в project / urls.py

admin.autodiscover()

urlpatterns = [
    path('', nostaff_admin_site.urls),
    path('radius/', include('radius.urls')),
    path('radius/', include('django.contrib.auth.urls')),
    path('admin/', admin.site.urls),
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...