Здравствуйте! Помогите пожалуйста разобраться.
Есть форма для создания новых пользователей, которой может пользоваться лишь суперпользователь. При отправки данных формы (submit) в консоле браузера выдает ошибку (см. ниже) и не создается новый пользователь. Также в терминал вывел детальные логи. Форма невалидная. Проблема возникла после того как стал использовать
password1 и
password2 вместо password.
P.S. До этого использовал поле
password и форму наследовал от
forms.ModelForm, а не от
UserCreationForm. Пользователь создавался, но пароль его не шифровался.
forms.py:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserCreateForm(UserCreationForm):
class Meta:
model = User
exclude = ('groups', 'user_permissions', 'is_staff')
def __init__(self, *args, **kwargs):
super(UserCreateForm, self).__init__(*args, **kwargs)
self.fields['username'].widget.attrs = {
'class': 'form-control',
'id': 'username',
}
self.fields['first_name'].widget.attrs = {
'class': 'form-control',
'id': 'first_name',
}
self.fields['last_name'].widget.attrs = {
'class': 'form-control',
'id': 'last_name',
}
self.fields['email'].widget.attrs = {
'class': 'form-control',
'id': 'email',
}
self.fields['password1'].widget.attrs = {
'class': 'form-control',
'id': 'password1',
}
self.fields['password2'].widget.attrs = {
'class': 'form-control',
'id': 'password2',
}
self.fields['is_active'].widget.attrs = {
'class': 'form-control',
'id': 'is_active',
}
self.fields['is_superuser'].widget.attrs = {
'class': 'form-control',
'id': 'is_superuser',
}
self.fields['last_login'].widget.attrs = {
'class': 'form-control',
'id': 'last_login',
'readonly': 'readonly',
}
self.fields['date_joined'].widget.attrs = {
'class': 'form-control',
'id': 'date_joined',
'readonly': 'readonly',
}
views.py:
class UserCreateView(CreateView):
template_name = 'users/create_user.html'
form_class = UserCreateForm
def get(self, request, *args, **kwargs):
data = dict()
user_create_form = UserCreateForm()
context = {'user_create_form': user_create_form,}
data['html_user_create_form'] = render_to_string(
'users/create_user.html', context, request=request
)
return JsonResponse(data)
def form_valid(self, form):
form.save()
data = dict()
data['form_is_valid'] = True
context = {'profiles': Profile.objects.all(),}
data['html_users'] = render_to_string('users/users.html', context)
return JsonResponse(data)
JS:
$(function ($) {
$("#userModalBox").on("submit", ".userCreateForm", function () {
var form = $(this);
var dataForm = new FormData(form.get(0));
$.ajax({
url: form.attr("action"),
data: dataForm,
type: form.attr("method"),
dataType: 'json',
success: function (data) {
if (data.form_is_valid) {
$("#loader").show("slow");
setTimeout(function() {
$("#loader").hide("slow");
$("#users").html(data.html_users);
$("#users").sortable("refresh");
$("#users").sortable("option", "disabled", $("#users .list-group-item").length == 1);
$("#userModalBox").modal("hide");
$("#userMessageCreate").fadeIn("slow");
setTimeout(function() {$("#userMessageCreate").fadeOut("slow");}, 2000);
$('#searchUsers').val('');
}, 2500);
}
else {
$("#userModalBox .modal-content").html(data.html_user_create_form);
}
},
error: function (xhr, ajaxOptions, thrownError) {
$("#userError").fadeIn("slow")
$("#userError span.error-description").html(thrownError);
setTimeout(function() {$("#userError").fadeOut("slow");}, 10000);
},
cache: false,
contentType: false,
processData: false
});
return false;
});
}(jQuery));
ERROR:
SyntaxError: JSON.parse: unexpected character at line 3 column 1 of the JSON data
Uncaught TypeError: a.replace is not a function
at Function.htmlPrefilter (jquery.min.js:3)
at pa (jquery.min.js:3)
at Ia (jquery.min.js:3)
at r.fn.init.append (jquery.min.js:3)
at r.fn.init.<anonymous> (jquery.min.js:3)
at S (jquery.min.js:3)
at r.fn.init.html (jquery.min.js:3)
at Object.error (crud.js:45)
at i (jquery.min.js:2)
at Object.fireWith [as rejectWith] (jquery.min.js:2)
В терминал вывел такие вот логи:
Time: [02/Nov/2017 03:34:53] | LevelName: DEBUG | Module: base | Process: 763 | Thread: 123145382191104 | Message: Exception while resolving variable 'user_create_form' in template 'users/create_user.html'.
Traceback (most recent call last):
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 903, in _resolve_lookup
(bit, current)) # missing attribute
VariableDoesNotExist: Failed lookup for key [user_create_form] in u"[{'False': False, 'None': None, 'True': True}, {u'csrf_token': <SimpleLazyObject: u'AlVubHD54ZGnGhwZSCNneZvhAXUesEVlwwat3NittKleDdSvLEZjHmCthH5nJeXJ'>, 'user': <SimpleLazyObject: <function <lambda> at 0x1078a8578>>, 'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x107977f10>, 'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10, 'INFO': 20, 'WARNING': 30, 'SUCCESS': 25, 'ERROR': 40}, 'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x1078b9e90>, u'request': <WSGIRequest: POST '/user/create/'>}, {}, {'form': <UserCreateForm bound=True, valid=False, fields=(password;last_login;is_superuser;username;first_name;last_name;email;is_active;date_joined;password1;password2)>, u'view': <users.views.UserCreateView object at 0x1078c40d0>}]"
ДОПОЛНИТЕЛЬНО:
Поэксперементировав понял что ошибка AJAX
SyntaxError: JSON.parse: unexpected character at line 3 column 1 of the JSON data
возникает если ввести короткий пароль или ввести разные пароли в поля
password1 -
password2. Как вывести ошибки Джанго, которые обычно возникают при таких ситуациях: Пароль слишком короткий или Пароли не совпадают.
В шаблоне есть два блока. Один для ошибок вызываемых AJAX-ом, другой для ошибок Django. Последний не работает. Что делать?
{# START: AJAX ERROR #}
<div class="alert alert-danger alert-dismissible text-center" role="alert" id="userError">
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
<strong> {% trans "Ошибка" %}:</strong> <span>{% trans "Проверьте введенные вами данные" %}.</span><br><span class="error-description"></span>
</div>
{# END: AJAX ERROR #}
{# START: DJANGO ERROR #}
{% if user_create_form.non_field_errors %}
<div class="well well-error">
{% for error in user_create_form.non_field_errors %}
<ul class="list-unstyled">
<li class="text-danger">
<i class="fa fa-exclamation-circle" aria-hidden="true"></i>
<strong> {{ error|escape }}</strong>
</li>
</ul>
{% endfor %}
</div>
{% endif %}
{# END: DJANGO ERROR #}