0

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

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

是否可以创建第二个界面以及偏离传统的登录用户名?Django 1.5s 自定义用户模型在这里对我有什么帮助吗?是否可以使用两种用户模型——一种用于管理员,一种用于我们的用户?

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

编辑:尽管我很讨厌这样做,但我将分别对会员区进行编码。登录出现了更多的奇怪之处,所以我认为这将是最简单的解决方案,即使不是很干燥。

4

2 回答 2

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 以强制执行该约束。或者您可能很懒惰,假设将分配密码,为每个用户分配一个随机用户名,确保您始终可以登录并“修复”有问题的帐户。

于 2013-02-27T08:44:26.263 回答
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)

就像这里的文档示例一样。(还可以在这里查看http 标头列表,了解如何进行检查)

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

于 2013-02-27T09:02:17.763 回答