django - 使用下拉值在创建时设置用户排名
问题描述
我的 Django Web 应用程序中有一个用户创建表单。我能够正常创建用户。
我的应用程序中有一个名为 user_type 的模型,它具有 is_admin 字段、is_manager 字段和链接到用户外键的 user 字段。我在我的用户创建表单中添加了一个下拉菜单,以使管理员能够创建用户并使用下拉菜单分配用户的 user_type。
我现在对如何获取管理员选择并根据它启用 user_type 感到困惑。
模型.py
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=254, unique=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
# CUSTOM USER FIELDS
firstname = models.CharField(max_length=30, blank=True, null=True)
lastname = models.CharField(max_length=30, blank=True, null=True)
telephone = models.IntegerField(blank=True, null=True)
address = models.CharField(max_length=300)
created_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
updated_at = models.DateTimeField(auto_now=True, blank=True, null=True)
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def get_absolute_url(self):
return "/users/%i/" % (self.pk)
class user_type(models.Model):
is_admin = models.BooleanField(default=False)
is_manager = models.BooleanField(default=False)
user = models.OneToOneField(User, on_delete=models.CASCADE)
def __str__(self):
if self.is_manager == True:
return User.get_email(self.user) + " - is_manager"
else:
return User.get_email(self.user) + " - is_admin"
视图.py
def AddUser(request):
if request.method == "POST":
email = request.POST.get('email')
telephone = request.POST.get('telephone')
firstname = request.POST.get('firstname')
lastname = request.POST.get('lastname')
address = request.POST.get('address')
zipcode = request.POST.get('zipcode')
city = request.POST.get('city')
region = request.POST.get('region')
country = request.POST.get('country')
password = User.objects.make_random_password()
# is_manager = request.POST.get('is_manager')
try:
user = User.objects.create_user(email=email, telephone=telephone, firstname=firstname, password=password,
lastname=lastname, address=address, zipcode=zipcode, city=city, country=country)
user.send_welcome_mail(new_password)
# if is_manager == True:
# user.user_type.is_manager == True
# else:
# user.user_type.is_admin == True
user.save()
messages.success(request, "User Created Successfully!")
return redirect('users')
except Exception as e:
messages.error(request, "Failed to Create User!" + str(e))
return redirect('users')
return render(request, "core/adduser.html")
adduser.html
<form method="POST">
{% csrf_token %}
<div class="row">
<div class="col-md-6 col-sm-12">
<div class="form-group">
<input type="text" name="email" placeholder="Email Address" class="form-control">
</div>
</div>
<div class="col-md-6 col-sm-12">
<div class="form-group">
<input type="text" name="telephone" placeholder="Telephone" class="form-control">
</div>
</div>
<div class="col-md-4 col-sm-12">
<div class="form-group">
<input type="text" name="firstname" placeholder="Firstname" class="form-control">
</div>
</div>
<div class="col-md-4 col-sm-12">
<div class="form-group">
<input type="text" name="lastname" placeholder="Lastname" class="form-control">
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<select class="custom-select2 form-control" name="user_type" style="width: 100%; height: 38px;">
<optgroup label="Select User Type">
<option value="M" name="is_manager">Manager</option>
<option value="A" name="is_admin">Admin</option>
</optgroup>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12 col-sm-12">
<div class="form-group">
<textarea name="address" placeholder="Address" class="form-control"></textarea>
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">Create User</button>
</form>
解决方案
在解释之前对代码样式进行了一些更改:
- 按照 Django 模型中的建议重命名
user_type
为。UserType
- 将视图重命名
AddUser
为add_user
PEP8 中建议的函数名称。
在您add_user
看来:
if request.method == "POST":
# ...get your fields from the form
user_type = request.POST.get("user_type")
# ...create your user here
# assign default values first
is_admin = False
is_manager = False
# parse value from the form input
if user_type == "M":
is_manager = True
elif user_type == "A":
is_admin = True
# now create 1-to-1 field
user_type = UserType.objects.create(
user=user, is_admin=is_admin, is_manager=is_manager
)
还有一些建议:
- 最好
user = User.objects.get(email=email)
先检查该用户是否存在并处理该场景。.get()
函数将给出User.DoesNotExist
异常,处理该异常以创建用户。尽量避免泛型Exception
类。 - 使用模型表单检查来自客户端的输入,它将确保您的输入适合模型要求,例如必填字段、字段长度等,甚至在尝试创建该模型之前。
推荐阅读
- azure-pipelines - 天蓝色管道中 timeoutInMinutes 的条件
- python - 使用 repath 参数的 Django url 调度程序
- python - 有没有办法让程序暂停一段时间但仍然有另一段代码在运行?
- python - Split-Apply-Combine 聚合 Pandas 数据框中的行
- javascript - 在另一个js文件中导入axios
- java - 等待方法响应而不阻塞其他HTTP请求的过程
- c# - 停止屏幕截图,包括 Windows 10 的 UWP 应用上的弹出窗口
- android - ionic 4 cordova-plugin-camera 默认前置摄像头无法在 android 上运行
- flutter - Android上初始化问题期间的文档访问
- javascript - 将参数链接到 JS 库