我想构建一个django网站,其中某组受信任的用户可以编辑他们的个人资料信息。让每个可信用户通过django管理界面是否有意义?我只希望他们能够看到和编辑他们自己的信息(显然)。这似乎不适合django人定义“信任”的方式,特别是粗体位......
来自The Django Book, Chapter 18:
管理员设计用于 你,开发者,信任的人。 这不仅仅意味着“那些人 已经过验证;“这意味着 Django假定您的内容 编辑可以信任做正确的事 的事情。
这意味着没有“批准” 编辑内容的过程 - 如果你 相信你的用户,没有人需要 批准他们的编辑。这也意味着 那个权限系统 功能强大,不支持限制 基于每个对象的访问。 如果你 相信某人可以编辑自己的 故事,你相信他们不要编辑 其他人未经许可。
这个用例是否适合django的管理模块,或者它只是一个不受信任的用户的专用视图?
答案 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视图,只需应用样式表即可与应用程序的其余部分保持一致的外观。