首页 > 解决方案 > 使用下拉值在创建时设置用户排名

问题描述

我的 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>

标签: djangodjango-modelsdjango-viewsdjango-formsdjango-templates

解决方案


在解释之前对代码样式进行了一些更改:

  1. 按照 Django 模型中的建议重命名user_type为。UserType
  2. 将视图重命名AddUseradd_userPEP8 中建议的函数名称。

在您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
    )

还有一些建议:

  1. 最好user = User.objects.get(email=email)先检查该用户是否存在并处理该场景。.get()函数将给出User.DoesNotExist异常,处理该异常以创建用户。尽量避免泛型Exception类。
  2. 使用模型表单检查来自客户端的输入,它将确保您的输入适合模型要求,例如必填字段、字段长度等,甚至在尝试创建该模型之前。

推荐阅读