使用复选框(布尔字段)创建员工用户

Creating staff users with a checkbox (booleanfield)

我正在制作一个博客风格的网站,对于注册表格,我决定添加一个复选框,上面写着“我是一名工作人员”,这样如果提交表格时选中了这个复选框,那么用户注册为工作人员,而不仅仅是普通会员。我知道这不是很安全,但在我的具体情况下它会很好用。

我知道我可以通过只为工作人员创建一个不同的表单来做到这一点,但我真的想用复选框来做到这一点。 所以,复选框在那里,我怎样才能让它检查是否被选中以成为员工用户?

非常感谢任何形式的帮助。

这是我的代码:

forms.py

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField(
        label= 'Correo Electrónico',
        required=True,
    )

    username = forms.CharField(max_length=100, required=True, label='Nombre de Usuario')
    
    password1 = forms.CharField(
        label = "Contraseña",
        required=True
    )
    password2 = forms.CharField(
        label = "Confirmar Contraseña",
        required=True
    )
    
    is_teacher = forms.BooleanField(
        label='Soy profesor/a',
        required=True,
    )

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2', 'is_teacher']

views.py

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Tu cuenta se ha creado correctamente, ahora puedes iniciar sesión')
            return redirect('login')

    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)

        img = Image.open(self.image.path)
        
        if img.height > 300 or img.width > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)

我能够解决我的问题。

我通过在代码中添加一些东西修复了它:**

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save(commit= False)
            username = form.cleaned_data.get('username')
            is_teacher = form.cleaned_data.get('is_teacher')
            if is_teacher == True:
                user.is_staff = True
                user.save()
            else:
                user.is_staff = False
                user.save() 
            messages.success(request, f'Tu cuenta se ha creado correctamente, ahora puedes iniciar sesión')
            return redirect('login')

    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

首先我将 'commit = False' 添加到 'form.save' 以便它保存它 但它不会立即将信息发送到数据库(这就是搞砸整个事情的原因,它会将所有内容直接写入数据库,然后它不会再更改它,除非我手动通过管理员完成的),所以它坚持下去,然后正如代码所说,如果 'is_teacher == True' (这是复选框),它将将该用户注册为工作人员,并且之后它再次保存表单,这次将数据发送到数据库,如果是相反的方式 'is_teacher == False' 那么它会做同样的事情,而不是说 'user.is_staff = True' 它会说它是假的。

我希望我能够正确地解释自己。