Я сделал регистрационную форму после учебника.Регистрация/регистрационная форма пользователя 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
На самом деле вы передаете форму в словаре данных. Это экземпляр класса. вы не можете передать экземпляр класса в json dictonary. –
um. не могли бы вы объяснить подробно? (Я только начал изучать эту вещь несколько дней назад, и им не очень хорошо :() и как я могу это исправить? –
Вы пытаетесь вернуть форму в ответ json, эта переменная формы является экземпляром класса, а не JSON serializable, поэтому удаляем форму в '' data = {'form': form, 'success': 'success'} '' –