使用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
相关产品推荐
相关产品推荐

