【问题标题】:How not to show the password when changing the user?更改用户时如何不显示密码?
【发布时间】:2020-01-30 09:36:54
【问题描述】:

我有一个带有自定义文件的自定义 UserAdmin。当我添加新用户时就可以了。但是当我想更改用户信息时,我会看到他的哈希密码。怎么不显示密码?

这是我的首要用户管理员。

class UserAdminForm(forms.ModelForm):
    middle_name = forms.CharField(label='Отчество', empty_value='1 ', required=False)

    class Meta:
        labels = {
            'last_name': 'Фамилия',
            'first_name': 'Имя',
            'password': 'Пароль',
        }


class UserAdmin(admin.ModelAdmin):
    form = UserAdminForm
    fields = ['username', 'password', 'last_name', 'first_name', 'middle_name', 'groups']
    list_display = ['username', 'last_name', 'first_name', 'url_get_money_from_user']

    def url_get_money_from_user(self, obj):
        return format_html('<a href="/admin/fbp_common/person/{}/change/">{}</a>', obj.person.id, 'Списать средства')

    url_get_money_from_user.allow_tags = True
    url_get_money_from_user.short_description = 'Ссылка для списания денежных средств'

    def save_model(self, request, obj, form, change):
        obj.is_staff = True
        obj.set_password(form.data['password'])
        obj.save()

【问题讨论】:

  • 尝试从from django.contrib.auth.admin import UserAdmin 继承你的UserAdmin 而不是ModelAdmin 并检查readonly_fields

标签: python django django-models django-forms django-admin


【解决方案1】:

我找到了解决方案。我应该使用PasswordInput 并把它放到widgets in class Meta

from django.forms import PasswordInput

class UserAdminForm(forms.ModelForm):
    middle_name = forms.CharField(label='Отчество', empty_value='1 ', required=False)

    class Meta:
        model = User
        fields = ['username', 'password', 'last_name', 'first_name', 'middle_name', 'groups']
        labels = {
            'last_name': 'Фамилия',
            'first_name': 'Имя',
            'password': 'Пароль',
        }
        widgets = {
            'password': PasswordInput(),
        }

我得到空的密码输入字段。

【讨论】:

    【解决方案2】:

    您可能想要覆盖 get_fields 表单方法以根据管理员中的创建/更改操作动态更改字段:

    def get_fields(self, request, obj=None):
        if obj:
           # record already exists - lets hide the password
           return ('username', 'last_name', 'first_name', 'middle_name', 'groups')
        return super().get_fields(request, obj)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      相关资源
      最近更新 更多