11

我想建立一个 django 站点,其中某些受信任的用户可以编辑他们的个人资料信息。让每个受信任的用户都通过 django 管理界面有意义吗?我只希望他们能够查看和编辑自己的信息(显然)。这似乎不符合 django 人定义“信任”的方式,尤其是粗体字...

来自Django Book,第 18 章

管理员旨在供您(开发人员)信任的人使用。这不仅仅意味着“经过身份验证的人”;这意味着 Django 假设您的内容编辑器可以被信任做正确的事情。

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

这是适合 django 管理模块的用例之一,还是只是针对不受信任的用户的专用视图?

4

6 回答 6

17

不,Django 管理员不适合单个用户配置文件,每个用户都可以查看和编辑所有其他用户配置文件。这更适合必须同时管理所有用户的管理员。

您需要构建的是用户个人资料页面。Django 已经有了一个不错的登录系统,由 django.contrib.auth 模块提供。您可以轻松地将其集成到您的页面中,这正是 Django 管理员用来验证用户的方式。

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

于 2009-01-31T04:48:35.287 回答
5

我建议您创建一个包含 OneToOneField 到用户模型(管理站点用户模型)的 Person 模型。有些像这样。。

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)
于 2009-01-31T18:40:48.323 回答
3

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

于 2009-01-31T04:43:32.600 回答
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.

要使上述工作正常进行,您需要启用会话,并确保在用户成功登录时将用户记录在会话中。您还需要在他们注销时消除会话。

于 2009-01-31T16:50:16.330 回答
1

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

于 2009-02-01T19:13:49.423 回答
1

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

在设计我目前正在开发的应用程序时,我有类似的愿望(使用管理员贡献),但我决定管理员应用程序确实是供管理员使用的,并且应该为普通用户提供自己的页面来完成工作和定制(如果需要)。

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

于 2009-02-04T12:15:25.977 回答