Джанго - несколько профилей

В моем проекте у меня есть два разных типа пользователей: учитель и ученик, каждый со своими данными профиля.

После поиска лучшего подхода, кажется, что путь вперед - использование наследования нескольких таблиц:

class BaseProfile(models.Model):
    user = models.OneToOneField(User)
    profile = models.CharField (max_length=10, choices={'teacher', 'student'})
    # other common fields

class Teacher(BaseProfile):
    # teacher specific fields

class Student(BaseProfile):
    # student specific fields

И в settings.py: AUTH_PROFILE_MODULE знак равно myapp.BaseProfile,

Теперь я хочу реализовать те же функции, что и в django-профилях:

  • создавать профили
  • редактировать профили
  • отображать профили

У меня есть хорошая идея, как сделать часть редактирования и отображения, когда у меня есть правильное значение в field profile из BaseProfile,

Эта проблема:

Теперь я хочу, чтобы создание профиля было сделано автоматически (и в правой БД: Teacher или же Student) непосредственно, когда пользователь создается с помощью сигнала. Поле profile Должен содержать значение "студент", когда пользователь регистрируется через сайт через регистрационную форму. Значение должно быть "учитель", когда администратор создает нового пользователя через интерфейс администратора.

У кого-нибудь есть идеи, как мне это сделать? Вероятно, мне нужно написать собственный сигнал, как показано ниже, и отправить его из пользовательской модели, но пока не нашел работающего решения:

def create_user_profile(sender, instance, request, **kwargs):
    if request.user.is_staff:
        BaseProfile(user=instance, profile='teacher').save()
    else:
        BaseProfile(user=instance, profile='student').save()

Другие и лучшие подходы, конечно, также приветствуются!

Спасибо!

1 ответ

Решение

На мой взгляд, это не очень хороший подход.

Я бы порекомендовал сделать 1 унифицированный профиль, который будет содержать опцию: user_type = models.CharField(choices=[your_choices], max_length=4)

Затем в моделях вы создадите две формы - 1 для учителя и 1 для студента.

class ProfileFOrm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(BaseProfileForm, self).__init__(*args, **kwargs)
        for name in self.fields:
            self.fields[name].required = True

class TeacherProfile(ProfileForm):
    class Meta:
        model = Profile
        fields = ('your_fields')


class StudentProfile(ProfileForm):
    class Meta:
        model = Profile
        fields = ('school')

Это просто моя идея для этого:)


отредактированный

Профильное издание:

Посмотреть.

def profile(request):
p = get_objects_or_404(ProfileModel, user=request.user)
return TemplateResponse(request, 'template.html', {'profile': p})

В моделях нам нужна функция для проверки, является ли пользователь учеником или учителем, поэтому:

class Profile(models.Model):
    ... your fields here...
    def get_student(self):
        return self.user_type == 1

В шаблонах:

{% if profile.get_student%}

>>>>get all data for students ex: <<<<
{{profile.name}}

{% endif %}


{% if profile.get_teacher %}
....
Другие вопросы по тегам