区分Django中的“帐户类型”

时间:2019-08-14 20:32:51

标签: python django

如果您正在阅读本文,请先感谢...我是一名高中生,正在使用Django开发网络应用程序,以帮助学生找到实习机会,并帮助父母发布实习机会-如果您愿意的话,这是一个市场会。

我正在尝试为用户创建个人资料/帐户页面,但是我需要一种方法来区分登录的帐户是学生帐户还是雇主帐户,以便我可以使用views.py生成适合他们的页面帐户。

在models.py中,我有两种不同的配置文件类型,它们可以与用户帐户关联(由django.contrib.auth处理),请参见下文以供参考。

class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profilePic = models.ImageField(default='default.jpg', upload_to='profile_pics')
    class Meta:
        verbose_name = 'Student Profile'
    def __str__(self):
        return f"{self.user.username}'s Profile"

class Employer(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profilePic = models.ImageField(default='default.jpg', upload_to='profile_pics')
    company = models.CharField(max_length=100, default='Unspecified')
    class Meta:
        verbose_name = 'Employer/Parent Profile'
    def __str__(self):
        return f"{self.user.username}'s Profile"

在我的views.py页中,我试图为帐户/个人资料创建一个视图,该视图可以检测当前登录用户的个人资料是否链接到“学生”或“父母”模型并提供页面相应。我尝试了一种非常基本的方法,如下所示,但是毫不奇怪,它没有用。

def account(request):
if user.student.username == True:
    context = 'Account: Student'
    return render(request, 'users/studentprofile.html', context)

elif user.employer.username == True:
    context = 'Account: Employer'
    return render(request, 'users/employer.html', context)

我想知道是否有人对我如何才能最好地做到这一点提出建议。在此道歉,如果这种方法的结构不完善或与Django编程的现状背道而驰,我是一个完整的初学者!

首先感谢所有:)

3 个答案:

答案 0 :(得分:1)

如果您将异常/错误与代码一起发布会更好

但是这里有一些提示: 传递给render函数的上下文参数应该是字典而不是字符串

context = {'Account: Student'}

,您应该使用 request.user 访问用户,而不仅仅是 user

如果上述问题不能解决您的问题 在函数的开头添加以下两行代码:

print(request.user.student)
print(request.user.employer)

答案 1 :(得分:0)

您可以在用户模型中拥有一个布尔字段,例如is_student,并在登录时进行填充。它可以为null=True,并且在用户退出时为null。

如果您有jwt令牌,则可以在令牌中存储其他数据以检查其来源,或者将用户当前角色存储在其cookie中。获取有关您的网站结构的更多数据,以获取更多相关答案。 (有关身份验证系统,数据库结构或任何其他结构行为的数据)

答案 2 :(得分:0)

正如Morteza Afshari所说,您应该重新组织模型以包含一个布尔字段。

class CustomUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profilePic = models.ImageField(default='default.jpg', upload_to='profile_pics')
    is_student = models.BooleanField(default=True)
    class Meta:
        verbose_name = 'Profile'
    def __str__(self):
        return f"{self.user.username}'s Profile"

这比以前的代码更好地遵循了DRY原理,因为现在我们不再重复user,profilePic等字段。

现在我们可以像这样重写您的views.py:

def account(request):
if user.is_student:
   context = 'Account: Student'
   return render(request, 'users/studentprofile.html', context)

else:
   context = 'Account: Employer'
   return render(request, 'users/employer.html', context)