django + ajax почтовая форма - PullRequest
0 голосов
/ 10 февраля 2020

я действительно использую ajax с django. Есть 2 формы. первый с именем и почтой. и быстрая форма с кодом подтверждения, который приходит по почте. Шаблон views.py

def get_name(request):
    if request.method == 'POST':
        user_code = generate_code(8)
        subject = 'code' 
        message = user_code
        form = NameForm(request.POST)
        if form.is_valid():
            Registration.objects.create(fio=request.POST['fio'],mail=request.POST['mail'])
            send_mail(subject, message,settings.EMAIL_HOST_USER,[mail],fail_silently=False)                       
            return JsonResponse({ 'form1': render_to_string( 'registers/endreg.html', {'form': NameForm1()},request=request ) })
    else:
        form = NameForm()
    return render(request, 'registers/detail.html', {'form': form})

(подробно. html)

    <form action="" method="post" autocomplete="off" id="my_form">
  {% csrf_token %}
  <div class="contact-form" >
   <h1>{%trans 'Registers' %}</h1>
   <div class="txtb">{{form.fio.label}} {{form.fio}}{{form.fio.help_text}}</div>
   <div class="txtb">{{form.phone.label}} {{form.phone}}{{form.phone.help_text}}</div>
   <input type="submit" value="{%trans 'send' %}" class="btn" id="btn">   
  </div>
</form>

Я вешаю событие, чтобы отправить эту форму

$(document).ready(function() 
    { $("#my_form").submit(function(event) 
        { event.preventDefault(); 
            $this = $(this); 
            $.ajax({ 
                type: "POST",
                data: $this.serialize(), 
                success: function(data) 
                { console.log(data); 
                    var parent=$("#my_form").parent();
                    parent.html(data.form1); 
                }, 
                error: function(data) 
                { console.log(data);
                    $this.html(data); 
                } 
            }); 
        }); 
});

ajax запрос работает и получаю мои 2 формы (endreg. html)

    <form action="endreg/" method="post" autocomplete="off" id="my_form2">
   {% csrf_token %}
  <div class="verification" >
 <div class="ver">
   {{form}}
     </div>
      <input type="submit" value="{%trans 'send' %}" class="btn1" > 
    </div>  
</form>

views.py

def endreg(request):
    if request.method == 'POST':
        form = NameForm1(request.POST)
        if form.is_valid():
            code_use = form.cleaned_data.get("key")
            try:
                user = Registration.objects.get(code=code_use)
                user.verification = True
                user.save() 
                JsonResponse({'message': 'thanks.'})
            except:
                JsonResponse({'error': 'erorr.'})
    else:
        form = NameForm1()
    return render(request, 'registers/endreg.html', {'form': form})

и 2-й ajax.

$(document).ready(function() 
    { $("#my_form2").submit(function(event) 
        { event.preventDefault(); 
            $this = $(this); 
            $.ajax({ 
                type: "POST",
                data: $this.serialize(), 
                success: function(data) 
                { console.log(data);                                         
               }, 
                error: function(data) 
                { console.log(data);
                                } 
            }); 
        }); 
});

Теперь вопрос. почему при вводе кода во второй форме код применяется и происходит перенаправление на localhost: 8000 / endreg с json.

1 Ответ

0 голосов
/ 10 февраля 2020

Похоже, что ваша форма недействительна, поэтому она загружает ту же страницу с введенными данными. Вы должны обработать условие отказа для form.is_valid(). И также не добавляйте пустой блок exception для обработки исключений.

def endreg(request):
    if request.method == 'POST':
        form = NameForm1(request.POST)
        if form.is_valid():
            code_use = form.cleaned_data.get("key")
            try:
                user = Registration.objects.get(code=code_use)
                user.verification = True
                user.save() 
                messages.warning(request, u'thanks.')
            except <b>Registration.DoesNotExist as e: </b> # Handling Exception for get()
                print("NOT FOUND", e)
                messages.warning(request, u'error.')
        <b>else:</b>  # if form is not valid
            <b>messages.warning(request, u'not valid.')</b>
            form = NameForm1() # reset the form
    else:
        form = NameForm1()
    return render(request, 'registers/endreg.html', {'form': form})

В вашем HTML вы также можете отрендерить {{ form.errors }}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...