簡體   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