根据请求用户和要呈现的视图限制对基于类的视图的访问

时间:2014-04-21 23:48:02

标签: django

现场:

简档/ models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key = True)
    birthdate = models.DateTimeField(blank=True)

    def __unicode__(self):
        return unicode(self.user)


class SpecialProfile(models.Model):
    user = models.OneToOneField(User, primary_key = True)
    ...
# additional fields here

    def __unicode__(self):
        return unicode(self.user)


class SpecialProfileURLs(models.Model):
    profile = models.OneToOneField(SpecialProfile, primary_key = True)
... #some more URLs
homepage_url = models.URLField(blank = True)

    def __unicode__(self):
        return unicode(self.profile)

class SpecialProfileImages(models.Model):
    profile = models.OneToOneField(SpecialProfile, primary_key = True)
    img1 = models.ImageField(blank = True, upload_to='profiles/')
    img2 = models.ImageField(blank = True, upload_to='profiles/')
    img3 = models.ImageField(blank = True, upload_to='profiles/')

    def __unicode__(self):
        return unicode(self.profile)`

简档/ views.py

class PublicProfileView(DetailView):
    template_name = "public_profile.html"
    model = User


class PrivateProfileView(DetailView):
    template_name = 'profile/profile2.html'
    context_object_name = "profile"
    model = User
    pk_field = 'pk'

简档/ urls.py

urlpatterns = patterns("",
    url(r'^$', 'mysite.views.home', name='home'), # give me nothing? just take me home!
    url(r'^(?P<pk>\d+)/$', PrivateProfileView.as_view(), name="profile"),
    url(r'^(?P<username>\w+)/$', ProfileRedirectView.as_view(), name="profile_redirect"),
    url(r"^edit/(?P<profile_id>\w+)/$", EditProfileView.as_view(), name="profile_update_form"),
)

问题在于: 我希望能够测试提供请求的用户是否与用于访问配置文件的ID相同。我会拦截GET请求并检查,但是当我这样做时django会生气(可能是因为它是一个DetailView)。是否有推荐/非hackish方式,以确保只有该配置文件所属的用户可以访问它?如果没有,那么发送请求的用户应该被重定向到PublicProfileView。

2 个答案:

答案 0 :(得分:1)

您的解决方案是一些不同的组合:

1)使用django-braces中的PermissionsRequiredMixin。这是向基于类的视图添加权限功能的简单方法。可以找到PermissionsRequiredMixin上的文档here

2)创建自己的权限。关于Django的文档是here。在基于类的视图中包含此权限。

Here's关于SO的相关答案,它解决了基于函数的视图中的同一问题。您可以使用它来帮助创建您的权限。

答案 1 :(得分:1)

回答我的第一个问题似乎很糟糕但幸好亚历克斯帮我找到了我想要的东西:

每个对象权限。

GitHub上有一个包django-guardian,它允许我为单个模型实例的任何用户或组设置特定权限。

documentation非常彻底。