django - 如何防止用户同时是两种类型?
问题描述
我有一个来自这个答案的模型:
class MyUser(AbstractUser):
is_student = models.BooleanField(default=False)
is_teacher = models.BooleanField(default=False)
是否可以防止在模型级别同时创建两种类型的新用户?换句话说,它可能只是is_student == False
,is_teacher == True
反之亦然。
解决方案
据我所知,您不能拥有多个具有不同属性的用户模型。Django 只能有一个 User 模型。如果您需要的唯一更改是需要删除其中一个字段,那么我最好的选择是在需要时忽略该字段。例如,当学生想要注册时,他们单击“以学生身份注册”链接,您只需is_teacher
在表单中省略该字段,反之亦然,如果它是教师。
这方面的一个例子可能是:
用户型号:
class User(AbstractUser):
"""User model."""
username = models.CharField(max_length=75, unique=True)
email = models.EmailField(_('email address'), unique=True)
is_student = models.BooleanField(default=False)
is_teacher = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = UserManager()
def __str__(self):
"""Return a string representation of the user."""
string_repr = str(self.username) + ' (' + str(self.email) + ')'
return string_repr
UserCreationForm 模型(适用于学生和教师):
class CreateUserStudentForm(UserCreationForm):
# Require the email field.
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ("email", "username", "is_student", "password1", "password2")
def clean_email(self):
data = self.cleaned_data['email']
return data.lower()
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
# Get all the relevant data, and save it.
user.email = self.clean_email()
user.username = self.cleaned_data["username"]
user.is_student = self.cleaned_data["is_student"]
user.set_password(self.cleaned_data['password1'])
# Save the newly created user.
if commit:
user.save()
return user
class CreateUserTeacherForm(UserCreationForm):
# Require the email field.
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ("email", "username", "is_teacher", "password1", "password2")
def clean_email(self):
data = self.cleaned_data['email']
return data.lower()
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
# Get all the relevant data, and save it.
user.email = self.clean_email()
user.username = self.cleaned_data["username"]
user.is_teacher = self.cleaned_data["is_teacher"]
user.set_password(self.cleaned_data['password1'])
# Save the newly created user.
if commit:
user.save()
return user
推荐阅读
- html - 我在页面上的图像做错了什么?
- linux - 如何用以某个数字开头的数字替换文件名?
- javascript - javascript: applyForce 函数错误
- html - Css从普通到粗体时相同的文本自动换行
- java - MediaException:从导出的 JAR 文件运行项目时 MEDIA_UNAVAILABLE
- objective-c - 在调用函数之前检查类目标成员资格
- swift - 可编码错误 - 预计解码字典
但找到了一个数组 - mysql - 尽管已设置密码并在连接 uri 中输入密码,但用户 root@localhost 的 mysql 访问被拒绝(使用密码:否)
- html - 链接的线性渐变
- python - Pyautogui 键盘命令不适用于菜单栏分配