django admin的有效用例?

时间:2009-01-31 03:56:55

标签: python django django-admin

我想构建一个django网站,其中某组受信任的用户可以编辑他们的个人资料信息。让每个可信用户通过django管理界面是否有意义?我只希望他们能够看到和编辑他们自己的信息(显然)。这似乎不适合django人定义“信任”的方式,特别是粗体位......

来自The Django Book, Chapter 18

  

管理员设计用于   你,开发者,信任的人。   这不仅仅意味着“那些人   已经过验证;“这意味着   Django假定您的内容   编辑可以信任做正确的事   的事情。

     

这意味着没有“批准”   编辑内容的过程 - 如果你   相信你的用户,没有人需要   批准他们的编辑。这也意味着   那个权限系统   功能强大,不支持限制   基于每个对象的访问。 如果你   相信某人可以编辑自己的   故事,你相信他们不要编辑   其他人未经许可。

这个用例是否适合django的管理模块,或者它只是一个不受信任的用户的专用视图?

6 个答案:

答案 0 :(得分:17)

不,Django管理员不适合个人用户个人资料,每个用户都可以查看和编辑所有其他用户个人资料。这更适合需要一次管理所有用户的管理员。

您需要构建的是用户个人资料页面。 Django已经有一个很好的登录系统,由django.contrib.auth模块提供。您可以轻松地将其集成到您的页面中,以及Django管理员用于对用户进行身份验证的确切内容。

接下来,您必须构建一个简单的页面,根据用户模型公开特定用户的个人资料信息。这应该是相对无痛的,因为它只需要一个视图和一个模板,模板可以利用ModelForms。

答案 1 :(得分:5)

我建议你创建一个Person模型,其中包含一个OneToOneField到用户模型(管理站点用户模型)。有些像这样......

from django.contrib.auth.models import User

    class Person(models.Model):
        """The person class FKs to the User class and contains additional user information
        including userImage, country, etc"""

        user = models.OneToOneField(User, related_name='person_fk')
        url = models.URLField(max_length=255, blank=True)
        country = models.CharField(max_length=2, blank=True)
        state = models.CharField(max_length=50, blank=True)
        zipCode = models.IntegerField(max_length=7, blank=True, null=True)
        userImage = models.ImageField(upload_to=generate_filename, blank=True, null=True)

答案 2 :(得分:3)

我不会考虑在网站上编辑我的个人资料作为管理任务。我认为django-profiles正是您所寻找的。

答案 3 :(得分:3)

Django的授权模型有点过于简单化了。它只是检查整个模型的许可。

对于这种事情,你几乎被迫编写自己的视图函数来处理额外的检查。

在你写完一两个之后,你会看到这个模式。然后你可以考虑编写自己的装饰器来处理这个问题。

def profileView( request, object_id ):
    p= Profile.objects.get( id=int(object_id) )
    if request.session['user'] != p.get_user():
        # respond with a 401 not authorized or a helpful message
    # process normally, since the session['user'] is the user for the Profile.

要使上述功能正常运行,您需要启用会话,并确保在用户成功登录时将其记录在会话中。您还需要在注销时根除会话。

答案 4 :(得分:1)

仅供参考,这里有一个snippet演示如何在Django管理员中轻松实现此效果(用户只能编辑他们的“自己的”对象)。警告:我不建议为用户配置文件执行此操作,使用ModelForm创建自己的编辑视图会更容易,也更灵活。

答案 5 :(得分:1)

有一些django可插拔应用程序允许管理模型的行级权限。但是,我更倾向于编写自己的视图,允许用户在应用程序中执行此操作。

在设计我正在使用的应用程序时,我有类似的愿望(使用admin contrib),但我认为管理员应用程序确实是供管理员使用的,并且应该为常规用户提供他们自己的页面来完成工作和定制(如果需要)。

您可以使用通用视图和模型轻松生成特定模型的CRUD视图,只需应用样式表即可与应用程序的其余部分保持一致的外观。