2012-07-23 80 views
0

我在这一段时间思考。我至少有两名演员/角色。 “学生”和“导师”。 我做了什么到现在为止,是使一个选择字段是这样的:Django ..注册不同类型的用户和处理他们的相关视图

class UserProfile(UserenaBaseProfile): 

     Roles = [('Student' , 'Student') , ('Tutor' , 'Tutor')] 
     .. 
     role = models.CharField(max_length = 20 , choices = actor_type , blank = True , null = True) 

现在我卡住了如何在他们的观点划分!

有一种方法可以在视图顶部使用user_passes_test,但我不知道如何创建组?

如果我有一个学生,我可以做这样的事情:

class Student(UserProfile): 
    """ 
    The Student actor and its necessary fields 
    """ 

    courses  = models.ManyToManyField('courses.Course' , null = True, blank = True, related_name = _('student') , through = 'Registration') 

    class Meta: 
     verbose_name = _("Student") 
     verbose_name_plural = _("Students") 

    def save(self , *args , **kwargs): 
     super(Student , self).save(*args , **kwargs) 

     user, created = User.objects.get_or_create(username=self.username) 
     group , created = Group.objects.get_or_create(name = "Student") 
     if created: group.save() 
     user.groups.add(group) 
     user.save() 

请你告诉我如何做到这一点的详细解答:

回答

1
@user_passes_test(lambda u: u.groups.filter(name='Student').exists()) 
def my_student_only_view(request): 
    ... 

UPDATE

如果您想使用实际的Student类,该类自动过滤为“学生”组中的用户a ND自动保存用户到该组,使用代理模式,和子User,不UserProfile

class StudentManager(models.Manager): 
    def get_query_set(self, *args, **kwargs): 
     qs = super(StudentManager, self).get_query_set(*args, **kwargs) 
     return qs.filter(groups__name='Student') 

class Student(User): 
    class Meta: 
     proxy = True 

    objects = StudentManager() 

    def save(self, *args, **kwargs): 
     super(Student, self).save(*args, **kwargs) 
     group, created = Group.objects.get_or_create(name='Student') 
     self.groups.add(group) 
+0

谢谢..但如果我想定义在基类的角色(如我的例子一样)和为我所有的角色制作一个“独特”的个人资料?我的意思是,而不是有“学生”和“导师”两个模型,我只设计一个模型(UserProfile)?如果这也是可行的,那么制定组织的程序是什么?或者......也许把它们分开成不同的模式是更好的方法? – Soask 2012-07-23 16:44:37

+0

我想每个角色都有不同的职业是更好的方法。 – Soask 2012-07-23 16:53:25

+1

这里不一定有“更好”的方法。您可以根据需要直接使用“用户”并按组筛选。这没什么错。如果你想要一个自定义的类,你需要为'User'使用一个代理模型。然后,您可以根据需要添加任意数量或多种方法;您只需更改或添加任何其他字段。 – 2012-07-23 16:57:03

相关问题