0

この質問はDjangoに関連しています:UpdateViewで変更されたフィールドのみを更新します

ユーザーが自分の電子メールを変更する方法を提供しようとしています。新しい電子メールをデフォルトとして保存する前に、新しく提供されたアドレスに電子メールを送信して、それが有効であることを確認したいと考えています。新しく提供された電子メールは DB の一時テーブルに保存されますが、以前の (古い) 電子メールは検証されるまで変更されません。

私が直面している問題は、古い電子メールが検証される前に新しい電子メールによって上書きされることです。UpdateView を使用してこれが発生しないようにするにはどうすればよいですか? 以下は私のコードです:

class AccountUpdate(UpdateView):
    """Updates an account"""

    context_object_name = 'account'
    form_class = UpdateForm
    template_name = 'accounts/update_account.html'
    success_url = '/accounts/home'

    def get_object(self, queryset=None):
        return self.request.user

    @sensitive_variables('new_password')
    @sensitive_post_parameters('new_password')
    def form_valid(self, form):
        account = Account.objects.get(pk=self.request.user.id)
        clean = form.cleaned_data
        new_password = clean.get('new_password')
        old_email = account.email
        new_email = clean.get('email')

        # check for new password and encrypt it before saving
        if new_password:
            #encrypt plain password
            form.instance.password = hash_password(clean['new_password'])

        # check for new email address and save it in temporary field until verified
        # ensure that new email is different and is currently not taken
        if old_email != new_email:
            try:
                # make sure someone else has not used this email as their new email
                temp_taken = Account.objects.get(new_email=new_email)
                if temp_taken:
                    raise ValidationError('An account with this email exist.')

            # save new email and send verification message
            # make sure we set 'DoesNotExist' on the 'Account' object itself
            # it prevents 'str' object has no attribute 'DoesNotExist' error
            except Account.DoesNotExist:
                verifystring = get_random_string()
                self.object.new_email = new_email
                self.object.new_email_verifystring = verifystring
                message = "Hey %s! " \
                      "Please click the link below to verify your new email:" \
                      "<a href='link_here'>Verify Email!</a>" %\
                      (clean['first_name'])
                self.object.email_user(subject='email verification.',
                                   message=message,
                                   from_email='no-reply@localhost')
        else:
            context = {}
            self.object = context.update(first_name=clean.get('first_name'),
                                     last_name=clean.get('last_name'),
                                     username=clean.get('username'),
                                     force_update=False)
        return super(AccountUpdate, self).form_valid(form)

答えがすでに他の場所にある場合は、それを教えてください。

4

2 に答える 2

1

これは、クラスベースのフィールドとはあまり関係がありませんが、機能していることがわかっているアドレスを失わないという問題があります。

or or somethingAccountという名前のフィールドをモデルに追加することをお勧めします。アカウントが変更されると、実際のフィールドはそのまま残り、新しいアドレスがその新しいフィールドに保存され、確認メールがそこに送信されます。new_emailunverified_emailemail

検証プロセスが完了した場合にのみ、新しいアドレスが電子メール フィールドに保存され、古いアドレスが上書きされます。また、更新フォームで、新しいアドレスを確認するまで古いアドレスが使用されることをユーザーに警告することも賢明です。

于 2013-08-26T19:44:00.677 に答える