You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Djongo的Django自定义用户模型表单验证数据库错误

问题解决方案

1. 升级Djongo版本

报错里的RecursionError是Djongo 1.3.6版本的已知SQL解析bug,该版本处理特定查询时会触发无限递归。直接升级到最新稳定版即可修复:

pip install --upgrade djongo

2. 手动添加表单层面的唯一性验证

由于Djongo可能无法正确触发Django模型的unique约束验证(导致数据库直接抛错而非表单显示友好错误),需要在用户创建表单中手动实现验证逻辑:

自定义User创建表单

from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import User
from django.core.exceptions import ValidationError

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('email', 'username', 'first_name', 'last_name', 'date_of_birth', 'country', 'state', 'city', 'gender')

    def clean_username(self):
        username = self.cleaned_data.get('username')
        if User.objects.filter(username=username).exists():
            raise ValidationError('A user with that username already exists.')
        return username

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if User.objects.filter(email=email).exists():
            raise ValidationError('A user with that email address already exists.')
        return email

关联Post模型的表单验证

如果Post模型关联User外键时触发错误,可在Post表单中添加用户存在性验证:

from django import forms
from .models import Post, User

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('user', 'title', 'content')

    def clean_user(self):
        user = self.cleaned_data.get('user')
        if not User.objects.filter(pk=user.pk).exists():
            raise ValidationError('Selected user does not exist.')
        return user

3. 注册自定义表单到Admin(如果使用Admin后台操作)

在admin.py中替换默认表单,确保后台操作时也能触发验证:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User, Post
from .forms import CustomUserCreationForm, PostForm

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    fieldsets = (
        (None, {'fields': ('email', 'username', 'password')}),
        ('Personal info', {'fields': ('first_name', 'last_name', 'date_of_birth', 'country', 'state', 'city', 'gender', 'profile_photo')}),
        ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
        ('Important dates', {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'username', 'password1', 'password2', 'first_name', 'last_name', 'date_of_birth', 'country', 'state', 'city', 'gender'),
        }),
    )
    list_display = ('email', 'username', 'first_name', 'last_name', 'is_staff')
    search_fields = ('email', 'username', 'first_name', 'last_name')
    ordering = ('email',)

admin.site.register(User, CustomUserAdmin)

class PostAdmin(admin.ModelAdmin):
    form = PostForm

admin.site.register(Post, PostAdmin)

关键说明

  • 升级Djongo是解决底层递归错误的根本方法,表单验证是补充,确保用户能看到友好的错误提示而非服务器报错。
  • 若升级后仍有问题,可尝试直接使用pymongo操作MongoDB,绕过Djongo的SQL解析层。

内容的提问来源于stack exchange,提问作者90_Priyanshu kumar Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:13:12