비밀번호 찾기, 변경 기능에서 이메일 형식 체크 질문드려요.
class UserPasswordResetView(PasswordResetView):
    template_name = 'common/password_reset.html'
    email_template_name = 'common/password_reset_email.html'
    success_url = reverse_lazy('common:password_reset')
    form_class = PasswordResetForm

    def form_valid(self, form):
        email = self.request.POST.get('email')
        try:
            validate_email(email)
        except ValidationError:
            messages.error(self.request, '올바른 이메일 주소를 입력하세요.')
            return render(self.request, 'common/password_reset.html')

        if User.objects.filter(email=email).exists():
            messages.success(self.request, '이메일로 재생성된 비밀번호를 발송했습니다.')
            return super().form_valid(form)
        else:
            messages.error(self.request, '해당 이메일의 사용자를 찾을 수 없습니다.')
            return render(self.request, 'common/password_reset.html')

password_reset.html

{% extends 'base.html' %}
{% block content %}
    <div class="container_block">
        <h5 class="border-bottom pb-2 mb-3">비밀번호를 잊으셨나요?</h5>
        <form method="post" class="post-form py-3" action="{% url 'common:password_reset' %}">
            {% csrf_token %}
            {% if messages %}
                {% for message in messages %}
                    {% if message.tags == 'success' %}
                        <div class="alert alert-success my-3" role="alert">
                            {{ message.message }}
                        </div>
                    {% endif %}
                    {% if message.tags == 'error' %}
                        <div class="alert alert-danger my-3" role="alert">
                            {{ message.message }}
                        </div>
                    {% endif %}
                {% endfor %}
            {% endif %}
            <div class="form-group">
                <label for="email">비밀번호 재설정을 위해 회원가입시 등록했던 이메일 주소를 입력하세요.</label>
                <input type="text" class="form-control" name="email" id="email">
            </div>
            <div class="my-3">
                <a href="/common/login/">로그인으로 돌아가기</a>
            </div>
            <button type="submit" class="btn btn-sm btn-primary">보내기</button>
        </form>
    </div>
{% endblock %}

위와같이 코드를 구성하여, email 로 들어온 값이 email 형식인지 검사하는 로직을 만들고 싶습니다.
email 형식인지 확인하는 것으로 validate_email 이라는 함수가 있어 사용해보려 하였으나,
email 에 abcdefg 라고 입력할 경우, '올바른 이메일 주소를 입력하세요.' message 가 뜨지 않고,
[email protected] 등 이메일 형식으로 입력할 경우, '해당 이메일의 사용자를 찾을 수 없습니다.'/'이메일로 재생성된 비밀번호를 발송했습니다.' 등 message만 출력되고 있습니다.

email 형식을 확인하는 로직을 참고할만한 것이 있다면 알려주세요!

rlghths91 628

2021년 3월 22일 1:07 오전

목록으로
2개의 답변이 있습니다. 1 / 1 Page

validate_email 사용법이 좀 잘못된 것 같네요.
다음 문서 참조해 보세요.

https://pypi.org/project/email-validator/

박응용

2021년 3월 22일 8:02 오전

class UserPasswordResetView(PasswordResetView):
    template_name = 'common/password_reset.html'
    email_template_name = 'common/password_reset_email.html'
    success_url = reverse_lazy('common:password_reset')

    def form_invalid(self, form):
        messages.error(self.request, '올바른 이메일 주소를 입력하세요.')
        return render(self.request, 'common/password_reset.html')

    def form_valid(self, form):
        email = self.request.POST.get('email')
        if User.objects.filter(email=email).exists():
            messages.success(self.request, '이메일로 재생성된 비밀번호를 발송했습니다.')
            return super().form_valid(form)
        else:
            messages.error(self.request, '해당 이메일의 사용자를 찾을 수 없습니다.')
            return render(self.request, 'common/password_reset.html')

이렇게 하니 작동을 하네요!
PasswordResetView 에서 이메일 형식이 아닌 값은 form_invalid 로 이메일 형식은 form_valid 로 보내는 것 같습니다.

rlghths91

2021년 3월 22일 11:02 오후