10

ソーシャルアカウントなしでプレーンな django-allauth を使用しています。すべてのユーザーは、自分のアカウントに関連付けられた電子メール アドレスを 1 つだけ持っている必要があります。つまり、登録/検証に使用されたものです。ユーザーがこの電子メールを変更できるようにしたいと考えています。

最初の質問は、検証メールを送信して新しいメールを再度検証する必要があるかどうかです。私の直感は、この新しいメールを確認したほうがいいと言っています。しかし、私はそれについて本当の議論を持っていません。

私の2番目の質問は、それを検証したい場合、そのプロセスは何らかの方法でdjango-allauthですでにサポートされていますか? 私は EmailView と AddEmailForm を見てきました。しかし、これらは 1 つのアカウントが複数の電子メール アドレスを持つことができるという仮定に基づいています (これは私が望んでいるものではありません)。

ありがとう

4

2 に答える 2

16

新しいメールアドレスを確認する必要があると思います。アプリケーションが定期的に電子メールを送信する場合、ユーザーが入力した電子メール アドレスだけに大量の電子メールを送信したくはありません。

私がしたことは、2 番目の電子メールが確認されるまで、複数の電子メール アドレスを許可することでした。次に、elssar が提案したように、django-allauth のemail_confirmedシグナルをリッスンします。アドレスが確認されたらすぐに、新しいメール アドレスをプライマリ メール アドレスとして設定し、以前の を削除しますEmailAddess。これが私がやったことの簡単な例です:

モデル:

from django.dispatch import receiver
from allauth.account.models import EmailAddress
from allauth.account.signals import email_confirmed

class CustomUser(models.Model):
    ...
    def add_email_address(self, request, new_email):
        # Add a new email address for the user, and send email confirmation.
        # Old email will remain the primary until the new one is confirmed.
        return EmailAddress.objects.add_email(request, self.user, new_email, confirm=True)

@receiver(email_confirmed)
def update_user_email(sender, request, email_address, **kwargs):
    # Once the email address is confirmed, make new email_address primary.
    # This also sets user.email to the new email address.
    # email_address is an instance of allauth.account.models.EmailAddress
    email_address.set_as_primary()
    # Get rid of old email addresses
    stale_addresses = EmailAddress.objects.filter(
        user=email_address.user).exclude(primary=True).delete()

ビュー:

def update_user_details(request):
    user = request.user
    new_email = request.POST.get('new_email')
    user.custom_user.add_email_address(request, new_email)
    ...
于 2015-04-15T22:15:00.127 に答える
3

これを行う方法はいくつかあります。

email_confirmedシグナル ハンドラーをリッスンし、ユーザーがEmailAccount自分のアカウントに関連付けられた 2 つのオブジェクトを持っているかどうかを確認する関数を用意し、そうであれば、もう一方のEmailAccountオブジェクトを削除します。

もう1つは設定さEMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URLEMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL、設定にあり、関連するビューで余分な電子メールアドレスが存在する場合は削除されます。

EmailView別の方法は、 and/orをオーバーライドしてAddEmailForm、必要なことを実行させることです。

EmailAddress.change確認なしでメールを変更するには、ビューでメソッドを呼び出すだけです。

于 2013-11-04T18:19:33.453 に答える