【问题标题】:Django Admin - when editing user his password is also needed and updatedDjango Admin - 编辑用户时,还需要并更新他的密码
【发布时间】:2020-01-19 12:38:02
【问题描述】:

我正在使用自定义用户模型和 Django Admin - 当我通过管理员更新用户时,它会搞砸密码并将其保存为纯文本而不是加密(我必须在表单中输入密码,该字段是必需的)。

如果我希望能够在没有密码的情况下编辑用户,我应该怎么做?

我阅读了Django admin. Edit user and leave password unchanged,但我认为那里的答案不适用于我的情况 - 我在视图中没有任何管理员代码。

models.py:

class User(AbstractUser):
  class Meta:
    db_table = 'app_user'

  allow_emails = models.BooleanField(default=False)
  accept_privacy_policy = models.BooleanField(default=False)
  email = models.EmailField(unique=True)

settings.py:

AUTH_USER_MODEL = "app.User"

admin.py

class UserAdmin(admin.ModelAdmin):
   list_display = ["username", "email", "allow_emails", "accept_privacy_policy", "date_joined", "is_staff", "is_superuser"]

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    在您的 admin.py 中,您的 UserAdmin 应该继承自 from django.contrib.auth.admin import UserAdmin

    from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
    
    class UserAdmin(BaseUserAdmin):
       list_display = ["username", "email", "allow_emails", "accept_privacy_policy", "date_joined", "is_staff", "is_superuser"]
    
    

    【讨论】:

    • 非常感谢,这正是我所缺少的 :) 但是现在管理员中的编辑表单缺少我的自定义字段。有没有办法添加这些自定义字段(例如allow_emails),而不必使用自定义视图?
    • 啊,我找到了答案 - 我可以通过字段集指定 admin.py 中的字段,如此处所述stackoverflow.com/a/53356561/1757181
    【解决方案2】:

    我建议手动创建一个表单。举个例子:

    class UpdateNameForm(forms.ModelForm):
        class Meta:
            model = User
            fields = ('first_name', 'last_name')
    

    您可以指定要更改的字段。然后你可以通过另一个视图来渲染它:

    @method_decorator(login_required, name='dispatch')
    class ChangeNameView(generic.edit.UpdateView):
        model = models.User
        template_name = 'myaccount/change_name.html'
        form_class = forms.UpdateNameForm
    
    
        def get_object(self):
            return self.request.user
    
        def get_success_url(self):
            return reverse('profile', kwargs={'slug': self.object.slug})
    

    这绝对是更多的工作,但是当你想要自定义 Django 的默认实用程序时,我会推荐这种方法,因为 Django 不提供一切。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2013-03-05
      相关资源
      最近更新 更多