Как обрабатывать и иметь два типа пользователей в Django - PullRequest
0 голосов
/ 20 декабря 2018

Я работаю над проектом, который должен обрабатывать два типа пользователей.нормальные пользователи и учителя.

Я создал одну основную модель.на самом деле я расширил встроенную модель AbstractUser django и добавил в нее некоторые другие поля.одним из дополнительных полей является is_teacher, которое является BooleanField, и по умолчанию установлено значение False.для регистрации пользователей я создал ModelForm из модели User, которую я расширил ранее.и во время регистрации я установил значение по умолчанию для is_teacher = False, чтобы указать, что этот пользователь является обычным пользователем.и для учителей регистрация is_teacher = True.Это нормально как для пользователей, так и для учителей, которые входят в систему и перенаправляют их на свою панель.но проблема наступит после этого.Мне нужна третья модель для чего-то еще.Мне нужно иметь поле ManyToMany в третьей модели с НОРМАЛЬНЫМИ пользователями и УЧИТЕЛЯМИ;оба из них, но у меня есть только одна модель.на самом деле я не отделял модели пользователей и учителей друг от друга.из-за этого я не знаю, как указать отношение ManyToMany с моделью пользователей и отношение ManyToMany с учителями.Есть кое-что, что я могу сделать (возможно) - создать два типа моделей: один для пользователей, другой для учителей, и в отношении этих двух моделей мне нужно создать две страницы входа, два профиля и две регистрации, а затем, возможно, я смогу создать третью.модель, как я уже говорил.Вопрос в том, правда ли иметь две модели: одну для пользователей, а другую для учителей ...?Есть ли какое-нибудь решение кроме этого.Я новичок в django. Объясните это ясно, пожалуйста.

Форма модели для 3rd_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 ]

0 голосов
/ 20 декабря 2018

Почему бы не сделать следующее:

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

У вас есть 2 пользователя user1 и user2 Вы можете сначала добавить в качестве учителя:

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

Если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте.

0 голосов
/ 20 декабря 2018

Вы можете создать другую модель для Учителей с полем OneToOne для Пользователя и сохранить только данные учителя в этой модели.При таком подходе вам не нужно создавать разные методы входа в систему, операции входа в систему могут выполняться на основе базовой модели пользователя, и вы можете использовать модель учителя для конкретных операций учителя.

class Teacher(models.Model):
    user = models.OneToOneField(User)
    ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...