首页 文章

邀请未被接受的用户也已注册

提问于
浏览
0

我的应用程序中的功能是用户应首先请求邀请,如果管理员(来自管理员)接受了他的邀请,则应发送一条可以注册的消息 .

功能的流程

用户使用他/她的电子邮件地址提交表单,将发送邮件说谢谢 . 现在,如果管理员接受他/她的请求,即request_accepted现在将为True,并且将发送一封邮件,说现在您可以注册 . 最后,当用户进入注册页面并提交表单时,应检查他在注册期间填写和提交的电子邮件是否已被接受 . 如果已接受,则注册已成功完成,否则会显示错误,指出此电子邮件地址尚未被邀请 .

class Invitation(models.Model):
    email = models.EmailField(unique=True, verbose_name=_("e-mail Address"))
    request_approved = models.BooleanField(default=False, verbose_name=_('request accepted'))

@receiver(post_save, sender=Invitation)
def send_email_when_invite_is_accepted_by_admin(sender, instance, *args, **kwargs):
    request_approved = instance.request_approved
    if request_approved:
        subject = "Request Approved"
        message = "Hello {0}! Your request has been approved. You can now signup".format(instance.email)
        from_email = None
        to_email = [instance.email]
        send_mail(subject, message, from_email, to_email, fail_silently=True)

def requestInvitation(request):
    form = InviteForm(request.POST or None)
    if form.is_valid():
        join = form.save(commit=False)
        email = form.cleaned_data.get('email')
        already_join, created = Invitation.objects.get_or_create(email=email)
        if created:
            already_join.save()
            subject = "Thank you for your request to sign up our community"
            message = "Welcome! We will be in contact with you."
            from_email = None
            to_email = [email]
            send_mail(subject, message, from_email, to_email, fail_silently=True)
            messages.success(request, '{0} has been invited'.format(email))
        return HttpResponseRedirect("/")
    context = {"form": form}
    return render(request, 'home.html', context)


ACCOUNT_SIGNUP_FORM_CLASS = 'pages.custom_sign_up_form.CustomSignupForm'

custom_signup_form.py

from invitation.models import Invitation

class CustomSignupForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(CustomSignupForm, self).__init__(*args, **kwargs)

    def clean_email(self):
        value = self.cleaned_data.get('email')
        print ('value before adapter', value)
        value = get_adapter().clean_email(value)
        print ('value', value)
        if value and app_settings.UNIQUE_EMAIL:
            value = self.validate_unique_email(value)
        try:
            Invitation.objects.get(email=value, request_approved=True)
        except Invitation.DoesNotExist:
            raise forms.ValidationError(errors['Sorry! you are not yet invited'])
        return value

    def signup(self, request, user):
      user.save()

我正在做的方式也允许注册到不被接受的用户 .

UPDATE

如果我把clean_email逻辑放在注册中

def signup(self, request, user):
      print ('request', request, user)
      value = self.cleaned_data.get('email')
      print ('email is', value)
      try:
          Invitation.objects.get(email=value, request_approved=True)
      except:
          raise forms.ValidationError(errors['sorry! You are not yet invited'])
      user.save()

我得到'名称错误未定义'

1 回答

  • 1

    根据您问题的更新部分:

    raise forms.ValidationError(errors['sorry! You are not yet invited'])
    

    这里出了问题 . 你说_1144862_与 sorry! You are...key ,并期望它返回一个值 .

    这是您尝试访问的内容:

    errors = {
        'sorry! you are not yet invited': None,
    }
    

    像这样的键,带有感叹号,空格等是无效的 .

    请注意,方法中未定义 error (而不是我在类中看到的任何地方) . 如果已初始化为 class 变量,则应使用 self 访问它 .

    如果尚未使用默认错误消息声明错误dict,则应将其创建为类变量 .

    class CustomerSignupForm(forms.Form):
        errors = {
            'not_invited': "Sorry! You are not yet invited.",
        }
    

    现在,在您的注册方法中,您可以访问错误消息:

    raise forms.ValidationError(
        self.errors['not_invited'],
        code='not_invited'
    )
    

    基于原始问题:

    我现在不是100%确定问题是什么 . 但是有一些事情你可以看一看并改进 .

    Point 1: 您的变量名称应该清楚地解释它包含的内容 . 即

    value = self.cleaned_data.get('email')
    

    是包含电子邮件字符串或无的字段 . 保持简单明了,并将 email 保留为变量名称 . 如果逻辑中的值发生更改,则可以将其重命名为新名称,以清楚地说明变量的内容 . value 是一个过于宽泛的名称,而且非常令人困惑 .

    value = get_adapter().clean_email(value)
    

    这里发生了什么?在定义值(再次输入错误名称)后有一个打印件,它返回什么?你期望它做什么?

    Point 2:clean 方法中保留您的验证您的 tryexceptValidationError 应该在您的表单清理方法中 . 如果它不适合于正在清理的其中一个字段,则应覆盖 clean 方法,运行 super 的clean方法并添加验证所需内容的自定义方法 .

    Point 3: signup 方法 . 我没见过你调用 signup 方法的地方 . 它不是从 forms.Form 继承的,所以就我所见,它尚未调用 .

    注意:我不打算为这个主题创建任何新的答案,我将更新这个'答案' .

相关问题