激活链接,允许在Django中提交数据库

时间:2014-01-13 05:12:51

标签: database django views activation

所以我有一个应用程序需要一个表单,并发送和电子邮件地址给某人,但我想要一种方法来粘贴和激活Django生成的URL到该电子邮件,而不是表单数据提交到数据库,直到单击激活链接。有没有办法做到这一点?

2 个答案:

答案 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标志。

概念:

  • 当用户成功注册时,请务必将标志设置为False;
  • 自动生成与用户ID相关联的唯一字符串,并通过电子邮件发送激活网址;
  • 在激活视图中,将密钥分解为用户ID并将is_active标志设置为True;
  • 在登录视图中,检查尝试登录的用户是否为is_active。

然后,您将确保登录的用户拥有确认的电子邮件地址。

Django文档on user authentication中的页面提供了所有必要的信息。对于示例登录视图,章节"How to log a user in"有一个。

如果您更喜欢使用可重复使用的应用,django-registration可能会完全满足您的需求。

(回复后添加:)为什么不将数据提交到数据库?让未经激活的用户驻留在您的数据库中的“浪费”并不会超过您实现不将数据提交到数据库的解决方案所需的工作量。此外,了解未激活用户的数量(并采取相应行动)可能更有意思。