如何在django中创建具有不同视图的用户配置文件?

时间:2014-03-23 18:09:29

标签: django django-models django-views

我有两种类型的用户:学生和机构。 两者都可以在网站上登录,并且他们有不同的个人资料视图。

我想对两种类型的用户使用“http://example.com/accounts/”,但运行不同的逻辑并为每个用户显示不同的模板。

例如,学生在访问他们的个人资料时,可以查看/修改他们的属性,如他们正在学习什么,感兴趣的课程等。另一方面,机构用户可以查看/修改他们自己模型的属性为机构信息。

机构用户类型:

class InstitutionProfile(models.Model):
user = models.OneToOneField(User, related_name='client')
gender = models.CharField(max_length=40, choices=GENDERS_TYPES, blank=True)

#Contact Information
location = models.ManyToManyField(Location)
address = models.CharField(max_length=254, blank=True)
zipcode = models.CharField(max_length=56, blank=True)
phone = models.CharField(max_length=56, blank=True)

def __unicode__(self):
    return '%s' % format(self.user)

学生用户类型:

class StudentProfile(models.Model):
user = models.OneToOneField(User, related_name='profile')
about_me = models.TextField(null=True, blank=True)
gender = models.CharField(max_length=40, choices=GENDERS_TYPES, blank=True)
birth = models.DateTimeField(blank=True, null=True)
#Contact Information
location = models.ManyToManyField(Location, related_name='homecountry')
address = models.CharField(max_length=254, blank=True)
zipcode = models.CharField(max_length=56, blank=True)
phone = models.CharField(max_length=56, blank=True)

#Interested
countries_interested = models.ManyToManyField(Location, blank=True, related_name='countries interested')
areas_interested = models.ManyToManyField(StudyArea, blank=True)
levels_interested = models.ManyToManyField(StudyLevel, blank=True)
languages_interested= models.ManyToManyField(LanguageCourse, blank=True)

def __unicode__(self):
    return '%s' % format(self.user)

view.py

class InstitutionProfileDetailView(DetailView):
    model = get_user_model()
    slug_field = "username"
    template_name = "account/institution_profile.html"

    def get_object(self, queryset=None):
        user = super(InstitutionProfileDetailView, self).get_object(queryset)
        InstitutionProfile.objects.get_or_create(user=user)
        return user

class StudentProfileDetailView(DetailView):
    model = get_user_model()
    slug_field = "username"
    template_name = "account/student_profile.html"

    def get_object(self, queryset=None):
        user = super(StudentProfileDetailView, self).get_object(queryset)
        StudentProfile.objects.get_or_create(user=user)
        return user

与2种不同类型的用户拥有不同观点的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用统一视图,并根据您的逻辑返回不同的视图 -

def accounts_view(request):
    if request.user.is_student(): # <-- check with your logic, is_student() is a stub
        return StudentProfileDetailView.as_view()
    elif request.user.is_institute():
        return InstitutionProfileDetailView.as_view()

并将accounts/指向accounts_view