【问题标题】:How to have 3 type of users in Django?如何在 Django 中拥有 3 种类型的用户?
【发布时间】:2018-01-17 14:20:26
【问题描述】:

我正在开发一个由 Django 支持的网站,其中我有三种类型的用户:

  • 教师:可以添加培训阶段优惠,
  • 学生:可以申请培训阶段的offer,
  • 公司:还可以添加培训阶段优惠。

我的主要问题是如何在 Django 中拥有三种类型的用户,以便我可以拥有三种类型的登录?

我目前的解决方案是我为每种类型的用户设置了三个模型(模型学生、模型教师、模型公司)。我也有三种不同的表格让公司、老师或学生注册。当在我的视图中正确编译表单时,我手动创建(通过编码),用户和我手动为相关模型创建一个对象,然后保存该对象。

主要问题是我创建的用户并没有按类型区分:

class Azienda(models.Model):
nome=models.CharField(max_length=200)
sede=models.CharField(max_length=200)
pIva=models.CharField(max_length=30)
email = models.EmailField()
user = models.OneToOneField(User)
#company model, in models.py

#company form, in forms.py
class AziendaForm(forms.Form):
nome = forms.CharField(max_length=200)
sede = forms.CharField(max_length=200)
pIva = forms.CharField(max_length=30)
email = forms.EmailField()
user = forms.CharField(max_length=100)
password = forms.CharField(widget=forms.PasswordInput)

#view of company registration form
def registratiAziende(request):
if request.method=='POST':
    form=AziendaForm(request.POST)
    if form.is_valid():
        form['nome'].value()
        azienda=Azienda()
        azienda.nome=form['nome'].value()
        azienda.sede = form['sede'].value()
        azienda.pIva = form['pIva'].value()
        azienda.email=form['email'].value()
        #I create a user         user=User.objects.create_user(form['user'].value(),form['email'].value(),form['password'].value())
        azienda.user=user
        azienda.save()
        #I save the company object
    return redirect('myapp:index')
else:
    form= AziendaForm()

return render(request, 'myapp/registratiAziende.html', {'form':form})

【问题讨论】:

  • 为用户创建一个表单并为用户的角色添加一个新字段,基于此您可以在教师、学生或公司中创建新条目。或者,您可以扩展 Django 的默认 User 模型,在其中添加一个新字段 role,通过它您可以区分。

标签: python django


【解决方案1】:

这三种类型的用户在您的系统中包含相似的属性但不同的角色。

只需在你的模型中添加属性role,这样你就不需要维护三个模型了。

【讨论】:

  • 其实我的3个模型都有一些共同属性,但还是有独占属性。
  • 您可以在模型User中定义那些公共属性,并定义Teachers\Students\Companies继承自User。
【解决方案2】:

可以通过将此模型作为 OneToOne 字段添加到默认用户模型来扩展默认用户模型。但是,对于您的情况,您必须使用 OneToOneField 创建一个不同的模型作为自定义用户模型,然后在学生、教师和公司中使用此模型。

CHOICES = (('student', 'student'), ('teacher', 'teacher'), ('company', 'company'))
class CustomUser(models.Model):
    user = models.OneToOneField(User)
    user_type = models.CharField(max_length=30, choices=CHOICES)

然后您可以在您的 Company、Student、Teacher 模型中使用此模型。

一个建议是不要为不同的模型使用公共字段。规范化您的数据库以消除冗余。

【讨论】:

  • 其实我的3个模型都有一些共同属性,但还是有独占属性。
猜你喜欢
  • 2019-05-21
  • 2017-08-11
  • 1970-01-01
  • 2021-12-02
  • 2020-07-27
  • 2023-01-21
  • 2018-07-28
  • 1970-01-01
  • 2020-10-03
相关资源
最近更新 更多