所以我有一个应用程序需要一个表单,并发送和电子邮件地址给某人,但我想要一种方法来粘贴和激活Django生成的URL到该电子邮件,而不是表单数据提交到数据库,直到单击激活链接。有没有办法做到这一点?
答案 0 :(得分:1)
根据我对第一个答案的评论,这里有一个更适合您需求的重新设计。
创建一个模型,例如ServiceHours,您要收集的数据旁边(完成时间,supervisor_email,...),包含以下字段:
activation_key=models.CharField(_('activation key'), max_length=40, null=True, blank=True)
validated=models.BooleanField(default=False)
我建议在模型中添加post_save signal,这样无论何时创建新的ServiceHours实例(通过保存表单),都会发送给主管的电子邮件。
# Add this to your models file
# Required imports
from django.db.models.signals import post_save
from django.utils.hashcompat import sha_constructor
import random
def _create_and_send_activation_key(sender, instance, created, **kwargs):
if created: # Only do this for newly created instances.
salt = sha_constructor(str(random.random())).hexdigest()[:5]
# Set activation key based on supervisor email
instance.activation_key = sha_constructor(salt+instance.supervisor_email).hexdigest()
instance.save()
# Create email
subject = "Please validate"
# In the message, you can use the data the volunteer has entered by accessing
# the instance properties
message = "Include instance hours, volunteer's name etc\n"
# Insert the activation key & link
messsage += "Click here: %s" % (reverse("validate_hours", kwargs={'id': instance.id, 'activation_key':instance.activation_key})
# Send the mail
from django.core.mail import send_mail # Move this import to top of your file ofcourse, I've just put it here to show what module you need
send_mail(subject, message, sender, recipients)
post_save.connect(_create_and_send_activation_key, sender=ServiceHours)
定义视图以根据激活密钥验证服务时间
# in views.py
def validate_hours(request, id, activation_key):
# find the corresponding ServiceHours instance
service_hours = ServiceHours.objects.get(id=id, activation_key=activation_key)
service_hours.validated = True
service_hours.save()
在您的urls.py中,为您的validate_hours视图定义一个网址:
urlpatterns += patterns('',
url(r'^validate-hours/(?P<id>[0-9]+)/(?P<activation_key>\w+)', validate_hours, name='validate_hours'),
这一切都是我的头脑,所以请原谅任何错误。我希望你能得到这个过程的要点,并可以根据你的确切需求进行扩展。
答案 1 :(得分:0)
您可能希望在用户上设置/取消设置is_active
标志。
概念:
然后,您将确保登录的用户拥有确认的电子邮件地址。
Django文档on user authentication中的页面提供了所有必要的信息。对于示例登录视图,章节"How to log a user in"有一个。
如果您更喜欢使用可重复使用的应用,django-registration可能会完全满足您的需求。
(回复后添加:)为什么不将数据提交到数据库?让未经激活的用户驻留在您的数据库中的“浪费”并不会超过您实现不将数据提交到数据库的解决方案所需的工作量。此外,了解未激活用户的数量(并采取相应行动)可能更有意思。