Проблема с регистрацией пользователей в Django: «Произошла ошибка. Пожалуйста, попробуйте еще раз».

Я пытаюсь реализовать регистрацию и вход пользователей в моем Django-проекте с помощью AJAX. Однако, даже когда я ввожу всю информацию правильно, я продолжаю получать сообщение об ошибке: «Произошла ошибка. Please try again."

Что я пробовал: Проверил валидацию формы в forms.py, и она, кажется, работает нормально.

Напечатал register_form.errors в views.py, но он не показывает никаких проблем.

Просмотрел ответ AJAX в консоли браузера, но он всегда возвращает сообщение об ошибке, не указывая, что именно пошло не так.

Попробовал обернуть метод .save() в блок try-except, но он не перехватывает никаких специфических исключений.

Релевантный код views.py:

def login_and_register(request): 
    login_form = LoginForm()
    register_form = CustomUserRegistrationForm()
    schools = School.objects.all()
    graduation_years = GraduationYear.objects.all()

    if request.method == 'POST':
        if 'register_submit' in request.POST:
            register_form = CustomUserRegistrationForm(request.POST)
            if register_form.is_valid():
                try:
                    user = register_form.save()
                    login(request, user)

                    if request.headers.get('x-requested-with') == 'XMLHttpRequest':
                        return JsonResponse({
                            'success': True,
                            'redirect_url': reverse('school_login'),
                            'message': "Registration successful! Please add your school information."
                        })

                    messages.success(request, "Registration successful! Please add your school information.")
                    return redirect('school_login')

                except Exception as e:
                    print(f"Registration error: {str(e)}")
                    if request.headers.get('x-requested-with') == 'XMLHttpRequest':
                        return JsonResponse({
                            'success': False,
                            'errors': [f"An error occurred during registration: {str(e)}"]
                        }, status=400)
                    messages.error(request, f"An error occurred during registration: {str(e)}")
            else:
                print("Form invalid:", register_form.errors)
                if request.headers.get('x-requested-with') == 'XMLHttpRequest':
                    return JsonResponse({
                        'success': False,
                        'errors': register_form.errors
                    }, status=400)
                for field, errors in register_form.errors.items():
                    for error in errors:
                        messages.error(request, f"{field}: {error}")

    context = {
        'login_form': login_form,
        'register_form': register_form,
        'schools': schools,
        'graduation_years': graduation_years,
    }
    return render(request, 'users/login_register.html', context)

forms.py:

class CustomUserRegistrationForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=True, label="First Name")
    last_name = forms.CharField(max_length=30, required=True, label="Last Name")
    school = forms.ModelChoiceField(queryset=School.objects.all(), required=True, label="School")
    graduation_year = forms.ModelChoiceField(queryset=GraduationYear.objects.all(), required=True, label="Graduation Year")

    class Meta:
        model = CustomUser
        fields = ('first_name', 'last_name', 'school', 'graduation_year', 'password1', 'password2')

    def clean(self):
        cleaned_data = super().clean()
        first_name = cleaned_data.get('first_name', '').strip().lower()
        last_name = cleaned_data.get('last_name', '').strip().lower()

        if not first_name or not last_name:
            raise forms.ValidationError("First Name and Last Name cannot be empty.")

        username = f"{first_name}.{last_name}"
        counter = 1
        temp_username = username
        while CustomUser.objects.filter(username=temp_username).exists():
            temp_username = f"{username}{counter}"
            counter += 1

        cleaned_data['generated_username'] = temp_username
        return cleaned_data

    def save(self, commit=True):
        user = super().save(commit=False)
        user.username = self.cleaned_data.get("generated_username")

        if commit:
            try:
                user.save()
            except Exception as e:
                raise forms.ValidationError(f"Error saving user: {e}")

        return user

Код AJAX в login.html

fetch(this.action, {
    method: 'POST',
    body: formData,
    headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value,
        'Accept': 'application/json'
    },
    credentials: 'same-origin'
})
.then(async response => {
    if (response.redirected) {
        window.location.href = response.url;
        return;
    }

    const contentType = response.headers.get('content-type');
    if (!contentType || !contentType.includes('application/json')) {
        const text = await response.text();
        console.error('Unexpected response:', text.substring(0, 100));
        throw new Error('Server error: Please try again.');
    }

    return response.json();
})
.then(data => {
    if (data.success) {
        if (data.redirect_url) {
            window.location.href = data.redirect_url;
        } else {
            showMessage('Registration successful! Redirecting...', 'success', 'registerMessages');
            setTimeout(() => window.location.reload(), 1500);
        }
    } else if (data.errors) {
        Object.entries(data.errors).forEach(([field, errors]) => {
            errors.forEach(error => showMessage(`${field}: ${error}`, 'error', 'registerMessages'));
        });
    } else {
        throw new Error('Invalid server response');
    }
})
.catch(error => {
    console.error('Registration error:', error);
    showMessage('An error occurred. Please try again.', 'error', 'registerMessages');
});

В чем может быть проблема? Я не вижу никаких ошибок валидации в register_form.errors.

Метод .save() выполняется внутри блока try-except, но он не перехватывает никаких конкретных исключений.

В ответе AJAX не содержится никаких значимых сообщений об ошибках.

Есть идеи, что может быть причиной этой проблемы и как я могу отладить ее дальше? Заранее спасибо!

Вернуться на верх