对于帐户的简单激活密钥,我必须使用随机数创建密钥,同时确保我没有使用与其他帐户相同的密钥。现在,这就是我所拥有的:
def get_random_word():
word = ''
i = 0
while i in range(10) and User.objects.filter(activation_key = word).exists():
word += random.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
i+=1
return word
我现在意识到的问题是,我使用django内置的User
类,其用户配置文件如下:
def create_user_info(sender, instance, created, **kwargs):
if created:
UserInfo.objects.create(user=instance)
post_save.connect(create_user_info, sender=User)
class UserInfo(models.Model):
user = models.OneToOneField(User)
pen_name = models.CharField(max_length=30)
activated = models.BooleanField()
activation_key = models.CharField(max_length=40)
def __unicode__(self):
return self.email + '-' + self.pen_name
我需要按用户个人资料进行过滤。因此,简而言之,我如何通过密钥或更具体地用户个人资料进行过滤。
答案 0 :(得分:3)
首先,将一个related_name添加到UserInfo:
class UserInfo(models.Model):
user = models.OneToOneField(User, related_name='profile')
...
https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name
然后你可以这样做:
User.objects.filter(profile__activation_key=word).exists()
希望它有所帮助:)
答案 1 :(得分:1)
我不是100%确定你想要达到的目标,但这里有两个可能符合你需求的答案:
<强>一般强>
首先,您需要将Django内置用户模型与UserProfile
模型连接起来。这是在settings.py
设置AUTH_PROFILE_MODULE
设置
AUTH_PROFILE_MODULE = 'myapp.UserProfile' # replace `myapp` with your application name
回答1
您可以通过user.get_profile()
获取特定用户的用户个人资料,假设user
是已存在的django.contrib.auth.User
实例。
回答2
您可以首先通过您要查询的任何键查询UserProfile
模型,然后将结果集直接映射回您的用户,例如:
from myapp.models import UserProfile
profiles = UserProfile.objects.filter(activation_key='abcdef')
for profile in profiles:
print profile.user # this is the profiles connected user instance
答案 2 :(得分:1)
首先,您并不关心2个用户是否拥有相同的激活密钥。这种情况非常罕见,不能成为任何攻击目标。
其次,为什么不在激活URL中包含用户名?
这样,您就可以确保为每个用户提供唯一的激活URL。
ex: yourwebsite.com/users/activate/{username}/{activationcode}
。
第三,您可以使用UUID而不是随机。 UUID被授予独特性(不完全是99.99%)。 http://docs.python.org/library/uuid.html
第四,您真的需要将激活码保留在配置文件信息中吗?为什么不创建独立的激活表,甚至可以将主键设置为激活码。大多数情况下,最好将与您经常使用的信息分开的信息分开。
第五,你根本不需要查询User表。您只需查询UserProfile表并检查激活密钥是否存在。然后,只有这样,您才可以使用OneToOne关系映射到原始用户。
答案 3 :(得分:0)
您甚至不需要将related_name值添加到用户关系中。以下查询适用于您的个人资料模型。
User.objects.filter(userinfo__activation_key=word).exists()