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

Django注册报错:'super' object has no attribute 'save'(自定义用户模型)

解决Django 1.8 + Python 3.5中AbstractUser扩展模型的save() TypeError问题

看起来你遇到的这个'super' object has no attribute 'save'错误,大概率是自定义User模型或者表单的save方法里,调用父类的方式出了问题。我来帮你拆解常见的问题点和修复方案:

1. 检查自定义User模型的save方法实现

如果你的自定义User模型里重写了save方法,一定要确保正确调用父类的save方法。Python 3里调用父类方法的正确写法是:

# mainpage/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    bio = models.TextField(blank=True)
    birth_date = models.DateField(null=True, blank=True)

    def save(self, *args, **kwargs):
        # Python 2/3兼容写法,注意super后面的括号和参数
        super(CustomUser, self).save(*args, **kwargs)
        # 或者Python 3更简洁的写法:super().save(*args, **kwargs)

如果你的代码写成了super.save(*args, **kwargs)(少了括号),就会触发错误——因为super本身是一个对象,不加括号的话你调用的是super对象的save方法,而非父类模型的save方法。

2. 检查注册表单的实现

如果表单继承自UserCreationForm,要确保它关联的是你的自定义User模型,且重写save方法时正确调用父类:

# signup/forms.py
from django.contrib.auth.forms import UserCreationForm
from mainpage.models import CustomUser

class SignUpForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'birth_date', 'password1', 'password2', )

    def save(self, commit=True):
        # 正确调用父类表单的save方法
        user = super(SignUpForm, self).save(commit=False)
        user.birth_date = self.cleaned_data['birth_date']
        # 其他自定义字段赋值逻辑
        if commit:
            user.save()
        return user

这里如果super调用错误(比如写成super.save(commit=False)),同样会触发TypeError。

3. 确认settings.py中已配置自定义User模型

在Django 1.8中,使用自定义User模型必须在settings.py里添加配置:

AUTH_USER_MODEL = 'mainpage.CustomUser'

如果没配置这条,Django会默认使用原生User模型,可能导致表单与模型不匹配,间接引发错误。

4. 检查视图中的表单处理逻辑

在signup/views.py里,确保你正确实例化表单并调用save:

# signup/views.py
from django.shortcuts import render, redirect
from .forms import SignUpForm

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            form.save()  # 调用表单的save方法,确保表单的save逻辑正确
            return redirect('home')
    else:
        form = SignUpForm()
    return render(request, 'signup/signup.html', {'form': form})

如果视图里错误地直接操作模型的save,或者传递参数有误,也可能导致类似问题。

你可以先从检查模型和表单的super调用写法入手,这是触发这个错误最常见的原因。

内容的提问来源于stack exchange,提问作者shutup1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:54:12