我是Django的新手,正在寻找一个中型项目的建议。我们的办公室管理员是一回事,但我们的用户也可以在线登录并查看类似(更有限但大部分相同)的界面。
问题是用户的电子邮件是用户名,电子邮件不一定是唯一的(但密码必须是您理解的原因)。贫民窟?是。但这是他们所期望的。
是否可以创建第二个界面以及偏离传统的用户名进行登录? Django 1.5s自定义用户模型在这里为我做了什么吗?是否可以使用两个用户模型 - 一个用于管理员,一个用于我们的用户?
最后,如果我完全朝着错误的方向前进,请告诉我。这是我之前提出的一个问题的后续问题,但我忘记了一些细节。
编辑:就像我讨厌这样做一样,我只会单独对会员区进行编码。登录出现了更多的怪异,所以我认为这将是最简单的解决方案,即使不是非常干。答案 0 :(得分:1)
有两个管理界面可能很傻。 Django的管理员支持强大的用户权限。
保持用户名的唯一性,并使用电子邮件身份验证后端。这样,用户可以根据需要使用他们的电子邮件地址。因为,至少在1.4中,电子邮件地址不一定是唯一的,你是明确的。
这是一个简单的电子邮件身份验证后端:
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
将以上内容添加到您的某个应用中名为backends.py的文件中,然后将其添加到您的settings.py中:
AUTHENTICATION_BACKENDS = AUTHENTICATION_BACKENDS + ('app.backends.EmailAuthBackEnd',)
关于整个唯一密码的事情......处理起来很棘手。您可以继承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}类似的功能我在上面提出的方法。