为用户分隔管理站点

时间:2013-02-27 08:25:18

标签: django django-admin

我是Django的新手,正在寻找一个中型项目的建议。我们的办公室管理员是一回事,但我们的用户也可以在线登录并查看类似(更有限但大部分相同)的界面。

问题是用户的电子邮件是用户名,电子邮件不一定是唯一的(但密码必须是您理解的原因)。贫民窟?是。但这是他们所期望的。

是否可以创建第二个界面以及偏离传统的用户名进行登录? Django 1.5s自定义用户模型在这里为我做了什么吗?是否可以使用两个用户模型 - 一个用于管理员,一个用于我们的用户?

最后,如果我完全朝着错误的方向前进,请告诉我。这是我之前提出的一个问题的后续问题,但我忘记了一些细节。

编辑:就像我讨厌这样做一样,我只会单独对会员区进行编码。登录出现了更多的怪异,所以我认为这将是最简单的解决方案,即使不是非常干。

2 个答案:

答案 0 :(得分:1)

  1. 有两个管理界面可能很傻。 Django的管理员支持强大的用户权限。

  2. 保持用户名的唯一性,并使用电子邮件身份验证后端。这样,用户可以根据需要使用他们的电子邮件地址。因为,至少在1.4中,电子邮件地址不一定是唯一的,你是明确的。

  3. 这是一个简单的电子邮件身份验证后端:

    from django.contrib.auth.backends import ModelBackend
    from django.contrib.admin.models import User
    
    class EmailAuthBackEnd(ModelBackend):
        def authenticate(self, email=None, password=None,**kwargs):
            try:
                user = User.objects.get(email=email)  
                if user.check_password(password):
                    return user
                return None
            except User.DoesNotExist:
                return None
    
  4. 将以上内容添加到您的某个应用中名为backends.py的文件中,然后将其添加到您的settings.py中:

    AUTHENTICATION_BACKENDS = AUTHENTICATION_BACKENDS + ('app.backends.EmailAuthBackEnd',)
    
  5. 关于整个唯一密码的事情......处理起来很棘手。您可以继承Django的用户模型,并将密码更改为唯一字符串,或者您可以手动修补PSQL以强制执行该约束。或者你可能很懒,假设会分配密码,为每个用户分配一个随机的用户名,安全知识,你可以随时登录并“修复”问题帐户。

答案 1 :(得分:0)

我建议您允许用户保留他们当前的凭据(从可用性的角度来看,这将是一个很大的优势),然后根据他们的来源调整他们看到的内容。 django的ModelAdmin有很多方法可以覆盖。因此,在模型基础上你可以做 -

class MyModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        self.exclude = []
        if request.META(REMOTE_ADDR) not in [# add list of internal ip's here]
            self.exclude.append('field_to_hide')
        return super(MyModelAdmin, self).get_form(request, obj, **kwargs)

与文档示例here中一样。 (另请查看http标头here列表,了解如何进行检查)

如果您想更改主管理菜单上可用的对象列表,请查看覆盖AdminSite,添加您自己的get_urls()方法,该方法提供与个人{{1}类似的功能我在上面提出的方法。