@nurzhannogerbek

Как создать нового пользователя | сохранить пароль нового пользователя?

Здравствуйте! Помогите пожалуйста разобраться.

Есть форма для создания новых пользователей, которой может пользоваться лишь суперпользователь. При отправки данных формы (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>&nbsp;{% trans "Ошибка" %}:</strong>&nbsp;<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>&nbsp;{{ error|escape }}</strong>
              </li>
            </ul>
        {% endfor %}
      </div>
    {% endif %}
    {# END: DJANGO ERROR #}
  • Вопрос задан
  • 314 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы