Я хочу получить аутентификацию по электронной почте

Была реализована функция аутентификации числа, которая генерирует восемь случайных символов.

я ввел имя пользователя и почту. потому что я хочу написать пароль для перебора в html и запросить его при просмотре с помощью Ajax.

Когда я ввожу имя пользователя и email, я хочу, чтобы номер аутентификации был отправлен на email. В то же время код, созданный в ajax, должен показать окно номера аутентификации. но ничего не происходит

что мне делать...? помогите мне!

#views.py
class RecoveryPwView(View):
    template_name = 'users/recovery_pw.html'
    recovery_pw = RecoveryPwForm

    def get(self, request):
        if request.method=='GET':
            form = self.recovery_pw(None)
            return render(request, self.template_name, { 'form':form, })


def ajax_find_pw_view(request):
    username = request.POST.get('username')
    email = request.POST.get('email')
    target_user = User.objects.get(username=username, email=email)

    if target_user:
        auth_num = email_auth_num()
        target_user.auth = auth_num 
        target_user.save()

        send_mail(
            'this is email verify',
            ['email'],
            html=render_to_string('users/recovery_email.html', {
                'auth_num': auth_num,
            }),
        )
    return HttpResponse(json.dumps({"result": target_user.username}, cls=DjangoJSONEncoder), content_type = "application/json")

#urls.py
path('recovery/pw/', RecoveryPwView.as_view(), name='recovery_pw'),
    path('recovery/pw/find/', views.ajax_find_pw_view, name='ajax_pw'),
    path('recovery/pw/auth/', views.auth_confirm_view, name='recovery_auth'),
    path('recovery/pw/reset/', views.auth_pw_reset_view, name='recovery_pw_reset'),

поскольку вы используете метод get в модели View, вы можете использовать его напрямую без проверки по методу, что и делает эта функция для простоты

Примечание:-
. теперь вы обрабатываете метод запроса методом get, что не позволяет вам использовать csrf_token в вашей форме

Теперь проблема в том, что вы пытаетесь использовать метод get для отправки данных, затем вы хотите получить эти данные в ajax методом Post, который вы не получите никаких данных, конечно, в дополнение к этому вы пытаетесь выполнить отдельную функцию в представлении, что вызывает проблему, где функция никогда не будет выполнена, потому что форма не знает, куда она должна отправить данные после создания запроса.

Итак, теперь вы можете удалить дополнительные функции, которые вы используете, и попытаться использовать и включить то, что вы хотите, в одно представление, чтобы предотвратить путаницу, поэтому следуйте решению следующим образом:

class RecoveryPwView(View):
    template_name = 'users/recovery_pw.html'
    recovery_pw = RecoveryPwForm

    def get(self, request):
        form = self.recovery_pw(None)
        return render(request, self.template_name, { 'form':form})

    def post(self, request):
        form = self.recovery_pw(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            email = form.cleaned_data.get('email')
            target_user = User.objects.get(username=username, email=email)
        
        # do send email here

        # return the render that you want to finish by post method here

html

<form method="post">
    {% csrf_token %}
    <div class="container">
      <div class="inner-box">
          <div class="title">
              <h1>비밀번호 찾기</h1>
          </div>
          <div class="input-box">
              {% comment %} <div class="id">
                <input type="email" placeholder="등록하신 메일로 인증번호가 발송됩니다." name="email" maxlenth="20" autocomplete="off" value="{{ form.email.value|default_if_none:'' }}" required />
              </div>
              <div class="username">
                <input type="username" placeholder="아이디를 입력하세요" name="username" maxlength="20" value="{{ form.username.value|default_if_none:'' }}" required />
              </div> {% endcomment %}
              {% for field in form %}
                <label>{{ field.label }}</label>
                <div>{{ field }}</div>
              {% endfor %}
          </div>
          <div class="btn">
              <div class="btn-white" id="btn_white"><button type="submit">임시 비밀번호 발송</button></div>
          </div>

          <div class="loading-box">
              <div id="loading"></div>
          </div>

      </div>

</form>

Теперь это решение не завершено, потому что я не уверен в понимании того, что именно вы хотите сделать, но по крайней мере вы можете видеть, что есть что-то новое для вашей проблемы, чтобы найти min проблему, проблема теперь будет исходить от Ajax просто дайте мне знать, с чем вы столкнулись после этого

Вернуться на верх