Как использовать один вид двумя разными пользователями в Django? - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть пользовательская модель, как показано ниже:

class CustomUser(AbstractUser):
    username = None
    email = EmailField(verbose_name='email address', max_length=255, unique=True, )
    first_name = CharField(verbose_name='First Name', max_length=30, null=True, )
    middle_name = CharField(verbose_name='Middle Name', max_length=30, null=True, blank=True, )
    last_name = CharField(verbose_name='Last Name', max_length=30, null=True, )
    phone_number = CharField(verbose_name='Phone Number', max_length=30, null=True, )
    is_partner = BooleanField(default=False, )
    is_student = BooleanField(default=False, )

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.email

Как показано выше, пользователь может быть студентом или партнером, который будет отвечать за несколько студентов и иметь доступ ких активы.Модель партнера выглядит следующим образом:

class Partner(Model):
    user = OneToOneField(CustomUser, on_delete=CASCADE)
    partner_name = CharField(max_length=100, )

Модель ученика выглядит следующим образом:

class Student(Model):
    user = OneToOneField(CustomUser, on_delete=CASCADE)
    student_name = CharField(max_length=100, )
    partner = ForeignKey(Partner, on_delete=SET_NULL, null=True)

Как показано, в модели ученика партнер может быть нулевым.Причина в том, что студент может либо напрямую зарегистрироваться в системе, не имея партнера, либо он / она может быть зарегистрирован партнером.Студент может даже указать партнера, который необязателен при зачислении.

У меня есть представление студента и шаблон URL:

path('student_profile/', student_profile, name='student_profile')

def student_profile(request):
    user = request.user
    student = get_object_or_404(Student, user=user)
    return HttpResponse('The student will do AAAAAA')

У меня есть шаблон URL и представление партнера:

path('partner_profile/', partner_profile, name='partner_profile')


def partner_profile(request):
    user = request.user
    partner = get_object_or_404(Partner, user=user)
    return HttpResponse('The partner will do some stuff such as updating his/her profile')

есть этот шаблон URL и представление, которое позволяет партнеру видеть его / ее список учеников:

path('partners/<int:partner_pk>/students/', partner_students, name='partner_students')

def partner_students(request):
    template_name = 'partners/partner_students.html'
    context = {}
    partner = get_object_or_404(Partner, user=request.user)
    partner_students = Student.objects.filter(partner=partner)
    context.update({'partner_students': partner_students})
    return render(request, template_name, context)

в шаблоне, у меня может быть этот путь URL:

path('students/<int:student_pk>/', partner_student_profile, name='partner_student_profile')


{% for student in partner_students %}
   <a href="{% url 'partner_student_profile' student_pk=student.pk %}">student.pk</a>
{% endfor %}

Что мне нужно, так это то, что вместо того, чтобы переписать представление, чтобы сделать что-то с профилем студента, я использую тот, который уже написан.Я хочу использовать это:

def student_profile(request):
    user = request.user
    student = get_object_or_404(Student, user=user)
    return HttpResponse('The student will do some stuff such as updating his/her profile')

Я не хочу писать это:

def partner_student_profile(request, student_pk):
    student = Student.objects.get(pk=student_pk)
    return HttpResponse('The partner will do AAAAAA for his/her student')

Я хочу повторно использовать уже написанное представление "student_profile"

1 Ответ

0 голосов
/ 29 сентября 2019

У вас есть URL-адрес, подобный следующему.

path('profile/<str:profile_type>/<int:pk>', profile_view, name='profile_view')

Теперь создайте представление для сопоставления с этим URL-адресом.

def profile_view(request, profile_type: str, pk: int):
    user = request.user
    if profile_type == 'partner':
        """
        do something
        """
        template_name = 'partner_handler.html'
        context = dict()
    elif profile_type == 'student':
        """
        do something
        """
        template_name = 'student_handler.html'
        context = dict()
    return render(request, template_name, context)

Таким образом, в основном вы используете два параметра пути URL-адреса, чтобы проверить, чтотип профиля, с которым вы хотите работать, в вашем случае это будет студент или партнер.В зависимости от типа профиля вы можете выбрать свой собственный шаблон и создать собственный контекст для передачи на выбранный шаблон.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...