2010-11-04 65 views
0

我试图根据用户是否登录来选择性地处理我的Django/Python应用程序中的字段。基本上,我有类似以下模型:基于Django中的用户认证设置模型字段的值

class Resource(models.Model): 
    uploaded = models.DateTimeField() 
    name = models.CharField(max_length=200) 
    description = models.CharField(max_length=500, blank=True) 
    file = models.CharField(max_length=200) 

我想要做的是,如果用户发生在(登录并访问基于此资源文件属性设置为一个值对某些权限后端进行测试),以及用户未登录时的另一个值。因此,当任何客户端代码尝试访问Resource.file时,如果用户未登录'http: //mysite.com/dummy_resource_for_people_without_access'。但是,如果用户登录并通过了一些权限测试,那么resource.file的值实际上就是该资源的真实URL(包括访问该资源的任何安全密钥等)。

从我读过的内容看来,只能通过将请求上下文从视图函数传递给模型来考虑当前登录的用户。但是,在上面的用例中,我试图更加紧密地控制模型中的访问,而不需要客户端代码调用特殊函数。

+1

是否需要将url存储在数据库中,还是可以动态生成?能够访问模型中的用户/请求不应该在django中用于各种设计最佳实践;您应该始终传递用户对象或重新考虑您的设计! – 2010-11-04 00:17:25

+0

必须使用文件密钥以及其他安全数据动态生成URL。 – Faisal 2010-11-04 13:24:52

回答

0

为了防止任何人感兴趣,我通过在django中实际创建一个自定义模型字段来解决上述问题,然后可以让用户生成一个URI。因此,在数据库中,我在文件列中存储了上述资源的密钥。不过,现在的文件栏是一些自定义字段:

class CustomFileField(models.CharField): 
    def to_python(self, value): 
     ... 
     return CustomFileResource(value) 


class CustomFileResource: 
    def __init__(self, *args, **kwargs): 
     .... 

    def uri(usr): 
     #this method then gets the uri selectively based on the user . 

上面的图案是好的,因为我可以包装数据库字段,然后创建用于获取基于谁是试图访问它的URI的具体方法。

0

最好的办法是创建一个用于访问文件属性的函数,并在那里检查。一般来说,可以将属性变成一个隐含的描述符,但是Django的元类魔法会阻碍这一点。

然而,一般来说,Django被设计为在视图级别处理验证(并且干净地完成)。如果您需要数据库层身份验证,请考虑使用其他设置,例如CouchDB。

+0

是的,我根据所有的文档猜测,但希望有一些技巧。我最终要做的仅仅是创建一个单独的模板标签和视图级函数,当我需要将我的模型中的文件密钥转换为有效的,经过许可检查的url时,我会调用它。如果能够无缝地完成这项工作本来是很好的,但我理解在模型层中进行会话的设计缺陷。 – Faisal 2010-11-04 13:27:06

相关问题