如何在 django 中使用两个不同用户的一个视图?

Posted

技术标签:

【中文标题】如何在 django 中使用两个不同用户的一个视图?【英文标题】:How to use one view by two different users in django? 【发布时间】:2020-01-29 00:07:43 【问题描述】:

我有一个自定义用户模型如下:

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)

如图所示,在 Student 模型中,partner 可以为 null。原因是学生可以在没有合作伙伴的情况下直接注册系统,或者他/她可以由合作伙伴注册。学生甚至可以在注册时指定可选的合作伙伴。

我有一个学生视图和 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】:

有一个这样的网址。

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 路径参数来检查您想要使用的个人资料类型,在您的情况下,它将是学生或合作伙伴。根据配置文件类型,您可以选择自己的模板并构建自己的上下文以传递给所选模板。

希望对你有帮助!

【讨论】:

以上是关于如何在 django 中使用两个不同用户的一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

Django中非视图函数获取用户对象

如何在不同应用程序的 django 视图中登录用户

如何将两个不同的ListAPIView转换为单个ModelViewSet

有 2 组用户在 django 中查看 2 个不同的视图

在基于 django rest 类的视图中允许不同类型的用户使用不同的视图

如何在 Django 中访问表单提交按钮的值?