почему я не могу войти в какую-либо учетную запись, пока я не сбросил пароль в django admin? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть модель профиля, которая имеет отношение один к одному с моделью пользователя из django.contrib.auth.models, когда я добавляю новый профиль из панели администратора, я заметил, что поле пароля не преобразуется в точки, когданабрав, он показывает действительный пароль, но проблема не в этом, проблема в том, что когда я создаю новый профиль, который, в свою очередь, создает нового пользователя и помечает атрибут is staff как true, я не могу войти впанель администратора с созданной учетной записью, если я не сбросил пароль вручную с помощью

python manage.py changepassword the-user-name

после того, как сбросил пароль, и только тогда даже с тем же паролем я могу войти внормально, кто-нибудь знает, почему это происходит? Я удостоверился, что это не ошибка при вводе пароля, и я пробовал его несколько раз, пока не убедился, что это то, что происходит на самом деле

Обновление

при входеМодель «Пользователи» из раздела «Аутентификация и авторизация», в отличие от ввода ее из имени приложения, обнаруживает, что помимо раздела пароля написано

Invalid password format or unknown hashing algorithm

как это исправить?

Я забыл сказать, что я использую UpdateView из общих видов и использую профиль модели в качестве атрибута модели, установленного для этого вида

код моего вида обновления

class ProfileUpdate(UpdateView):
    model = Profile
    fields= [
        'username',
        'bio',
        'avatar_thumbnail',
        'location',
        'tags',
        'contact_information'
        ]
    def get_object(self):
        return Profile.objects.get(pk = self.kwargs.get('user_pk'))

    def get_queryset(self):
        base_qs = super(ProfileUpdate, self).get_queryset()
        return base_qs.filter(username=self.request.user.username)

1 Ответ

0 голосов
/ 08 ноября 2019

Это будет наследоваться от ModelAdmin вместо UserAdmin в вашем admin.py.

Можете ли вы попробовать это:

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from app.models import Profile

class ProfileAdmin(UserAdmin):

   def __init__(self, *args, **kwargs):
      super(UserAdmin,self).__init__(*args, **kwargs)
      UserAdmin.fieldsets += (('profile', {'fields': ('attr1', 'attr2')}),)

admin.site.unregister(User)    
admin.site.register(Profile, ProfileAdmin)

Объяснение

Когда вы зарегистрировали администратора Profile следующим образом, admin.site.register(models.Profile), внутренне он наследовал от класса ModelAdmin, который идеально подходит для всех других классов. Но для пользователя нам нужно хеширование для сохранения поля passwrd, поэтому существует отдельный класс UserAdmin, который должен быть унаследован от.

Как только вы унаследовали, проблема с паролем была решена, но поскольку базовой моделью был UserAdmin, показывались только поля, связанные с пользователем. Нам нужно было добавить поля профиля, для которых мы добавили метод __init__ и добавили поля профиля в раздел администратора.

...