没有这样的表:'Auth User' Django 注册表单的错误



尝试在我的网站上注册用户,并在提交时收到此错误。

OperationalError: no such table: auth_user

我已经按照其他帖子中的建议运行了 makemigrations 和迁移,但它没有帮助。

如果我转到帐户/sign_up页面(调用sign_in视图),输入用户名和密码,则会出现上述错误。

请注意,在我的设置文件中,我也绕过了auth_user模型,如下所示:

AUTH_USER_MODEL = "accounts.User"

这是回溯:

File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbbackendsutils.py" in execute
64.                 return self.cursor.execute(sql, params)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbbackendssqlite3base.py" in execute
323.         return Database.Cursor.execute(self, query, params)
The above exception (no such table: auth_user) was the direct cause of the following exception:
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangocorehandlersbase.py" in get_response
149.                     response = self.process_exception_by_middleware(e, request)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangocorehandlersbase.py" in get_response
147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:UserscrstuDesktopJSPROJdealmazingaccountsviews.py" in sign_up
46.         if form.is_valid():
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangoformsforms.py" in is_valid
161.         return self.is_bound and not self.errors
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangoformsforms.py" in errors
153.             self.full_clean()
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangoformsforms.py" in full_clean
364.         self._post_clean()
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangoformsmodels.py" in _post_clean
402.             self.validate_unique()
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangoformsmodels.py" in validate_unique
411.             self.instance.validate_unique(exclude=exclude)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbmodelsbase.py" in validate_unique
930.         errors = self._perform_unique_checks(unique_checks)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbmodelsbase.py" in _perform_unique_checks
1025.             if qs.exists():
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbmodelsquery.py" in exists
651.             return self.query.has_results(using=self.db)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbmodelssqlquery.py" in has_results
501.         return compiler.has_results()
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbmodelssqlcompiler.py" in has_results
819.         return bool(self.execute_sql(SINGLE))
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbmodelssqlcompiler.py" in execute_sql
848.             cursor.execute(sql, params)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdebug_toolbarpanelssqltracking.py" in execute
159.         return self._record(self.cursor.execute, sql, params)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdebug_toolbarpanelssqltracking.py" in _record
101.             return method(sql, params)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbbackendsutils.py" in execute
79.             return super(CursorDebugWrapper, self).execute(sql, params)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbbackendsutils.py" in execute
64.                 return self.cursor.execute(sql, params)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbutils.py" in __exit__
95.                 six.reraise(dj_exc_type, dj_exc_value, traceback)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangoutilssix.py" in reraise
685.             raise value.with_traceback(tb)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbbackendsutils.py" in execute
64.                 return self.cursor.execute(sql, params)
File "C:UserscrstuAppDataLocalProgramsPythonPython36-32libsite-packagesdjangodbbackendssqlite3base.py" in execute
323.         return Database.Cursor.execute(self, query, params)
Exception Type: OperationalError at /accounts/sign_up/
Exception Value: no such table: auth_user

这是 models.py 文件

from django.contrib.auth.models import (
AbstractBaseUser,
BaseUserManager,
PermissionsMixin
)
from django.contrib.auth.models import User
from django.db import models
from django.utils import timezone
from django.conf import settings
from django.db.models.signals import post_save
import os
import datetime

def avatar_upload_path(instance, filename):
return os.path.join('avatars', 'user_{0}', '{1}').format(
instance.user.id, filename)

class UserManager(BaseUserManager):
def create_user(self, email, username=None, password=None):
if not email:
raise ValueError("Users must have an email address")
if not username:
username = email.split('@')[0]
user = self.model(
email=self.normalize_email(email),
username=username,
)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email,
username,
password,
)
user.is_staff = True
user.is_superuser = True
user.save()
return user
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=40, default='')
date_joined = models.DateTimeField(default=timezone.now)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
def __str__(self):
return "@{}".format(self.username)
def get_short_name(self):
return self.username
def get_long_name(self):
return "@{} ({})".format(self.username, self.email)

class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key=True, related_name='profile')
first_name = models.CharField(max_length=40, default='', blank=True)
last_name = models.CharField(max_length=40, default='', blank=True)
date_birth = models.DateField(default=datetime.datetime.now())
email = models.EmailField(max_length=100, default='')
avatar = models.ImageField('Avatar picture',
upload_to=avatar_upload_path,
null=True,
blank=True)
def __str__(self):
return self.user.username
@property
def get_avatar_url(self):
if self.avatar:
return '/media/{}'.format(self.avatar)
return 'http://www.gravatar.com/avatar/{}?s=128&d=identicon'.format(
'94d093eda664addd6e450d7e9881bcad'
)

def create_profile(sender, **kwargs):
if kwargs['created']:
user_profile = UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)

和 forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserChangeForm
from django.core import validators
from . import models

class UserProfileForm(forms.ModelForm):
class Meta:
model = models.UserProfile
fields = [
'first_name',
'last_name',
'email',
'avatar',
]

class EditProfileForm(forms.ModelForm):
verify_email = forms.EmailField(label = "Please verify email address")
class Meta:
model = models.UserProfile
fields = [
'first_name',
'last_name',
'email',
'verify_email',
'avatar',
]
def clean(self):
cleaned_data = super().clean()
email = cleaned_data['email']
verify = cleaned_data['verify_email']
if email != verify:
raise forms.ValidationError(
"You need to enter same email in both fields."
)

和 views.py

from django.contrib import messages
from django.contrib.auth import authenticate, login, logout, update_session_auth_hash
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm, PasswordChangeForm
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from . import models
from . import forms
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = User
fields = UserCreationForm.Meta.fields
def sign_in(request):
form = AuthenticationForm()
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
if form.user_cache is not None:
user = form.user_cache
if user.is_active:
login(request, user)
return HttpResponseRedirect(
reverse('home')
)
else:
messages.error(
request,
"That user account has been disabled."
)
else:
messages.error(
request,
"Username or password is incorrect."
)
return render(request, 'accounts/sign_in.html', {'form': form})

def sign_up(request):
form = CustomUserCreationForm()
if request.method == 'POST':
form = CustomUserCreationForm(data=request.POST)
if form.is_valid():
form.save()
user = authenticate(
username=form.cleaned_data['username'],
password=form.cleaned_data['password1']
)
login(request, user)
messages.success(
request,
"You're now a user! You've been signed in, too."
)
return HttpResponseRedirect(reverse('home'))  # TODO: go to profile
return render(request, 'accounts/sign_up.html', {'form': form})

def sign_out(request):
logout(request)
messages.success(request, "You've been signed out. Come back soon!")
return HttpResponseRedirect(reverse('home'))

@login_required
def view_profile(request):
profile = request.user.userprofile
return render(request, 'accounts/user_profile.html', {'profile':profile})
@login_required
def edit_profile(request):
user = request.user
if request.method == 'POST':
form = forms.EditProfileForm(data=request.POST, files=request.FILES, instance=user.userprofile)
if form.is_valid():
form.save()
return redirect('/accounts/profile')
else:
return render(request, 'accounts/edit_profile.html', {'form':form})
else:
form = forms.EditProfileForm(instance=user.userprofile)
args = {'form':form}
return render(request, 'accounts/edit_profile.html', args)
@login_required
def change_password(request):
if request.method == 'POST':
form = PasswordChangeForm(data=request.POST, user=request.user)
if form.is_valid():
form.save()
update_session_auth_hash(request,form.user)
return redirect('/accounts/profile')
else:
form = PasswordChangeForm(user=request.user)
args = {'form': form}
return render(request, 'accounts/change_password.html', args)
@property
def image_url(self):
if self.image and hasattr(self.image, 'url'):
return self.image.url

您需要对UserCreationForm进行子类化才能使用自定义使用模型。

调整文档中的示例,您将执行以下操作:

from django.contrib.auth.forms import UserCreationForm
from accounts.models import User
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = User
fields = UserCreationForm.Meta.fields

然后在sign_up视图中使用CustomUserCreationForm

有关详细信息,请参阅有关自定义用户和内置身份验证表单的文档。

在这种情况下,我想不需要导入,删除文件中的以下语句

models.py
from django.contrib.auth.models import User
forms.py
from django.contrib.auth.models import User

最新更新