Джанго - несколько профилей
В моем проекте у меня есть два разных типа пользователей: учитель и ученик, каждый со своими данными профиля.
После поиска лучшего подхода, кажется, что путь вперед - использование наследования нескольких таблиц:
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 %}
....