Создание пользователей персонала с флажком (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' он скажет, что это false.

Надеюсь, я смог правильно объясниться.

Вернуться на верх