使用复选框(布尔字段)创建员工用户
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' 它会说它是假的。
我希望我能够正确地解释自己。
我正在制作一个博客风格的网站,对于注册表格,我决定添加一个复选框,上面写着“我是一名工作人员”,这样如果提交表格时选中了这个复选框,那么用户注册为工作人员,而不仅仅是普通会员。我知道这不是很安全,但在我的具体情况下它会很好用。
我知道我可以通过只为工作人员创建一个不同的表单来做到这一点,但我真的想用复选框来做到这一点。 所以,复选框在那里,我怎样才能让它检查是否被选中以成为员工用户?
非常感谢任何形式的帮助。
这是我的代码:
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' 它会说它是假的。
我希望我能够正确地解释自己。