使用自定义用户模型过滤字段-Django

时间:2020-04-26 11:01:09

标签: django

是Django的新手。

我创建了一个自定义用户模型,如下所示。我还创建了一个页面供用户更新其详细信息。我希望两个用户“组”使用同一页面“ account.html”来更新其详细信息。但是,如果用户是“雇员”,我想显示其他字段。

简而言之,我正在尝试实现以下逻辑: 如果用户组=“客户”,则显示字段A和B以进行更新 如果用户组=“员工”,则显示字段A,B,C和D更新

非常感谢任何帮助

Models.py

group_types = [('Client', 'Client'), ('Employee','Employee')]

class Account(AbstractBaseUser):
    email = models.EmailField(verbose_name="email", max_length=60, unique=True)
    username = models.CharField(max_length=30, unique=True)
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    groups = models.CharField(choices=group_types, default="client", max_length=60)
    company_name = models.CharField(verbose_name='company name', max_length=30)

account.html

<form class="form-signin" method="post">{% csrf_token %}
  <h1 class="h3 mb-3 font-weight-normal">Account Details</h1>
  <p> Email Address </p>
  <input type="email" name="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus value={{account_form.initial.email}}>
  <br>
  <p> Username </p>
  <input type="text" name="username" id="inputUsername" class="form-control" placeholder="Username" required autofocus value={{account_form.initial.username}}>
  <br>
  <p> Company Name </p>
  <input type="text" name="company_name" id="inputCompany_Name" class="form-control" placeholder="Company Name" required autofocus value={{account_form.initial.company_name}}>

1 个答案:

答案 0 :(得分:0)

您可以使用modelform_factory动态生成表单,可以根据用户传递不同的字段

FIELDS = {
    'Client': ['a', 'b', 'c'],
    'Employee': ['a', 'b', 'c', 'd', 'e']
}

def view(request):
    form_class = modelform_factory(Account, fields=FIELDS.get(request.user.groups))
    form = form_class(instance=request.user)
    ...