【问题标题】:How to handle and have two types of users in django如何在 django 中处理和拥有两种类型的用户
【发布时间】:2019-05-21 03:13:51
【问题描述】:

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

我创建了一个主要模型。实际上我扩展了 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)

【问题讨论】:

  • 在您的第三个模型中为用户添加 2 个 M2M 字段有什么问题?一个给老师,另一个给正常。你预见到什么困难?
  • 谢谢。正如我告诉过你的,我没有分离模型 User。我将(教师和普通)用户都保存在模型 User 中。那么如何在第三种模型中定义 M2M?我没有模型 Teacher。仅限模型用户。
  • 请看下面我的解决方案。

标签: python django database


【解决方案1】:

为什么不这样做:

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()

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-17
      • 1970-01-01
      • 2023-01-21
      • 2021-12-02
      • 2018-08-05
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2016-05-17
      相关资源
      最近更新 更多