繁体   English   中英

如何在 django 中处理和拥有两种类型的用户

[英]How to handle and have two types of users in django

我正在开发一个应该处理两种类型用户的项目。 普通用户和教师。

我创建了一个主要模型。 实际上我扩展了 AbstractUser 内置的 django 模型并添加了一些其他字段。 额外字段之一是 is_teacher,它是 BooleanField,默认为 False。 对于用户注册,我从之前扩展的模型 User 创建了 ModelForm。 在注册时,我为 is_teacher = False 设置默认值以指定该用户是普通用户。 对于教师注册 is_teacher = True。 这对于用户和教师都可以登录并将他们重定向到他们的面板。 但问题是在那之后。 我需要第三个模型来做别的事情。 我需要在普通用户和教师的第三个模型中有 ManyToMany 字段; 他们两个,但我只有一个模型。 实际上,我并没有将用户和教师模型彼此分开。 因此,我不知道如何指定与用户模型的多对多关系以及与教师的多对多关系。 我可以做的事情(也许)是创建两种类型的模型,一种用于用户,一种用于教师,对于这两种模型,我必须创建两个登录页面和两个配置文件以及两个注册,然后也许我可以创建第三个我告诉你的模型。 问题是:是否真的有两个模型,一个用于用户,一个用于教师......? 除了这个有没有解决办法。 我是 django 新手,请解释清楚。

third_model 的模型形式:

class RequestForm(forms.ModelForm):
    class Meta:
        model = ThirdModel
        fields = ("height", "age", "address")

        widgets = {
            "user": "hidden"
        }

在 ThirdModel 中保存数据的视图:

@login_required
def request_plan(request):
    form = RequestForm(request.POST or None)
    if form.is_valid():
        user = request.POST.get('username')
        form.save(commit=False)
        form.save()

    context = {
        "request_form": form
    }
    return render(request, "plan/request.html", context)


 class User(AbstractUser):
SEX_CHOICES = (
    ("male", "Male"),
    ("female", "Female")
)
sex         = models.CharField(max_length=6,    choices=SEX_CHOICES)
bio         = models.CharField(max_length=100)
is_coach    = models.BooleanField(max_length=100, default=False)

您可以使用 OneToOne 字段为用户创建另一个教师模型,并在该模型中保留教师专用数据。 您不需要使用这种方法创建不同的登录方法,登录操作可以在基本用户模型上运行,您可以使用教师模型进行特定于教师的操作。

class Teacher(models.Model):
    user = models.OneToOneField(User)
    ....

为什么不这样做:

class ThirdModel(models.Model):
    teachers = models.ManyToManyField(User, related_name='third_model_teachers')
    normal_users = models.ManyToManyField(User, related_name='third_model_normals')

您有 2 个用户user1user2您可以先添加为教师:

third_model.teachers.add(user1)
third_model.normal_users.add(user2)

获取用户为教师的所有third_model。

user1.third_model_teachers.all()

获取用户为普通用户的所有third_models

user2.third_model_normals.all()

如果您有任何问题,请发表评论。

您可以使用以下型号

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM