【问题标题】:Django - setting staff member as default for new usersDjango - 将工作人员设置为新用户的默认值
【发布时间】:2021-04-06 19:03:54
【问题描述】:

大家!

我正在尝试将新用户设置为默认的 staff_member,但我找不到任何解决方案。我真的需要帮助。我的代码如下。

型号

class Participante(models.Model):
    nome = models.CharField(max_length=100)
    cpf = models.CharField(max_length=13)
    email = models.EmailField()
    dt_criacao = models.DateTimeField(auto_now=True)
    is_staff = models.BooleanField(
        ('staff status'),
        default=True,
        help_text=('Designates whether the user can log into this admin site.'),
    )

    def __str__(self):
        return self.nome

表格

class ParticipanteForm(UserCreationForm):

    first_name = forms.CharField(max_length=100, label='Primeiro nome')
    last_name = forms.CharField(max_length=100, label='Último nome')
    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'email', 'password1', 'password2'] 

观看次数

def cadastro(request):
    form = ParticipanteForm()

    if request.method == 'POST':
        form = ParticipanteForm(request.POST)
        
        if form.is_valid():
            #User(request, username=username, password=password1)
            form.save()
            return redirect('dashboard')

    return render(request, 'cadastro.html', locals())

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    我认为这里的问题是您的 UserCreationForm 指向的是 User 模型,而不是您的自定义 Participante 模型。因此,用户不会被保存在您期望的表中。

    settings.py 中,将Participante 模型设置为您的用户模型(您的Participante 模型还必须继承AbstractUser 以保留User 模型的方法等。

    阅读:https://docs.djangoproject.com/en/3.1/topics/auth/customizing/#django.contrib.auth.models.AbstractUser

    # settings.py
    AUTH_USER_MODEL = 'your_app.models.Participante'
    
    # your_app.models
    from django.contrib.auth.models import AbstractUser
    
    class Participante(AbstractUser):
        nome = models.CharField(max_length=100)
        cpf = models.CharField(max_length=13)
        email = models.EmailField()
        dt_criacao = models.DateTimeField(auto_now=True)
        is_staff = models.BooleanField(
            ('staff status'),
            default=True,
            help_text=('Designates whether the user can log into this admin site.'),
        )
    
        def __str__(self):
            return self.nome
    

    然后在您的表单中,使用get_user_model() 指向您的AUTH_USER_MODEL

    # forms.py
    from django.contrib.auth import get_user_model
    
    class ParticipanteForm(UserCreationForm):
    
        first_name = forms.CharField(max_length=100, label='Primeiro nome')
        last_name = forms.CharField(max_length=100, label='Último nome')
        class Meta:
            model = get_user_model()
            fields = ['username', 'first_name', 'last_name', 'email', 'password1', 'password2']```
    
    

    【讨论】:

      【解决方案2】:

      你设置.instance.is_staff属性包裹在form中,所以:

      def cadastro(request):
          if request.method == 'POST':
              form = ParticipanteForm(request.POST)
              if form.is_valid():
                  form.instance.is_staff = True
                  form.save()
                  return redirect('dashboard')
          else:
              form = ParticipanteForm()
          return render(request, 'cadastro.html', locals())

      您的ParticipanteForm 也适用于User 模型,而不是Participante 模型。如果您将Participante 设置为用户模型,则可以使用get_user_model() function [Django-doc]

      from django.contrib.auth import get_user_model
      
      class ParticipanteForm(UserCreationForm):
          first_name = forms.CharField(max_length=100, label='Primeiro nome')
          last_name = forms.CharField(max_length=100, label='Último nome')
          
          class Meta:
              model = get_user_model()
              fields = ['username', 'first_name', 'last_name', 'email', 'password1', 'password2']

      然而,要使Participante 成为用户模型,还需要一些额外的工作。 Django 在substituting a custom user model [Django-doc] 上有一个话题。

      【讨论】:

      • 他的表单在Meta 子类中有User 模型。这不是问题吗?他的用户被保存到User 模型而不是Participante 模型。
      • @Nicky:您使用的用户模型到底是什么?当前模型不能用作用户模型,因为它应该满足多个合约。
      • 我不是问这个问题的人。他的is_staff 具有默认的True,但我假设他的用户被保存到User 模型而不是他的自定义Participante 模型。否则,is_staff 将始终为真。
      • 即使他的自定义模型设置为,他的表单是否也必须指向settings.AUTH_USER_MODEL 的模型?指向User 并不指向他的自定义模型。
      猜你喜欢
      • 1970-01-01
      • 2014-01-16
      • 2018-07-10
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 2022-11-12
      相关资源
      最近更新 更多