2016-07-21 5 views
0

Я сделал регистрационную форму после учебника.Регистрация/регистрационная форма пользователя Django не работает

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

я устанавливал 3 формы: электронная почта, EMAIL2 и пароль в index.html

но сайт ничего не делает, и Apparantly он не работает.

Я также получаю

TypeError: не JSON сериализации

ошибка.

Я думаю, что я делаю что-то неправильно здесь.

Не могли бы вы объяснить мне, что я делаю неправильно?

спасибо.

index.html

<script> 

// using jQuery 
function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie !== '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) === (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrftoken = getCookie('csrftoken'); 

function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 
$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 

</script> 


<div class="signup_div"> 
<form id="signup_form" method="post" action=""> 
{% csrf_token %} 

      <div class="field-wrap"> 
      <!--<label> 
      Email Address 
      </label>--> 
      <input required="" type="text" name="email" placeholder="Email address"> 
     </div> 

     <div class="field-wrap"> 
     <!--<label> 
      Email Address 
     </label>--> 
     <input required="" type="text" name="email2" placeholder="Email address"> 
     </div> 

     <div class="field-wrap"> 
      <!--<label> 
      Password 
      </label>--> 
      <input required="" type="password" name="password" placeholder="Password"> 
     </div> 

     <button class="ladda-button forgot" data-color="mint" data-style="slide-up"><a href=""><span class="ladda-label">Forgot Password?</span></a></p></button> 

     <button class="ladda-button button-primary login_button" data-style="slide-up"/><span class="ladda-label">Sign Up</span></button> 

     </form> 
</div> 

      <script> 

      $('#signup_form').on('submit', function(e) { e.preventDefault() 
       formdata = $('#signup_form').serialize(); formdata.csrfmiddlewaretoken = '{{ csrf_token }}'; 
       $.ajax({ 
        type:"POST", 
        data: formdata, 
        url: '{% url 'signup' %}', 
        error: function(response){ 
        $('.login_div').text(response.error) 
        }, 
        success: function(response){ 
        <!--console.log(response);--> 
        $('.signup_div').text(response.success) 
         $('.signup_div').text(response.error) 
        // do something with response 
       } 
       }); 
      }); 
      </script> 
</body> 
</html> 

views.py

def ajax_signup(request): 
    form = UserSignupForm(request.POST or None) 
    if form.is_valid(): 
     user = form.save(commit=False) 
     password = form.cleaned_data.get('password') 
     user.set_password(password) 
     user.save() 

     new_user = authenticate(username=user.username, password=password) 
     login(request, new_user) 
     data = {'form': form, 'success': 'success'} 
    else: data = {'form': form, 'error': 'error'} 

    return HttpResponse(json.dumps(data), content_type='application/json') 

и forms.py

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth import authenticate, get_user_model, login, logout 

class UserSignupForm(forms.ModelForm): 
    email = forms.EmailField(label='Confirm Email') 
    email2 = forms.EmailField(label='Confirm Email') 
    password = forms.CharField(widget=forms.PasswordInput) 
    class Meta: 
     model = User 
     fields = [ 
      'username', 
      'email2', 
      'email', 
      'password' 
     ] 
    def clean_email(self): 
     email = self.cleaned_data.get('email') 
     email2 = self.cleaned_data.get('email2') 
     if email != email2: 
      raise forms.ValidationError("Emails must match") 
     email_qs = User.objects.filter(email=email) 
     if email_qs.exists(): 
      raise forms.ValidationError("This email has already been registered") 
     return email 
+0

На самом деле вы передаете форму в словаре данных. Это экземпляр класса. вы не можете передать экземпляр класса в json dictonary. –

+0

um. не могли бы вы объяснить подробно? (Я только начал изучать эту вещь несколько дней назад, и им не очень хорошо :() и как я могу это исправить? –

+0

Вы пытаетесь вернуть форму в ответ json, эта переменная формы является экземпляром класса, а не JSON serializable, поэтому удаляем форму в '' data = {'form': form, 'success': 'success'} '' –

ответ

1

Как правильно указал Nikhil, вы пытаетесь сериализовать экземпляр формы , Вместо этого вы должны сериализовать данные формы.

Django Docs От:

Whatever the data submitted with a form, once it has been successfully validated by calling is_valid() (and is_valid() has returned True), the validated form data will be in the form.cleaned_data dictionary.

Кроме того, form.cleaned_data не будет доступна, если is_valid() не возвращает значение True. Вместо этого вы можете использовать request.POST

Вместо:

data = {'form': form, 'success': 'success'} 
else: data = {'form': form, 'error': 'error'} 

Вы хотите сделать:

data = {'form': form.cleaned_data, 'success': 'success'} 
else: 
    data = {'form': request.POST, 'error': 'error'} 
+0

спасибо вам обоим. –

Смежные вопросы