[英]User Registration with error: no such table: auth_user
我正在尝试使用 Django 的默认身份验证来处理注册和登录。
setting.py
:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'books',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
AUTH_USER_MODEL = 'books.User'
books.models.py
:
class User(AbstractUser):
account_balance = models.DecimalField(max_digits=5, decimal_places=2, default=0)
views.py
:
from django.contrib.auth.forms import UserCreationForm
def register(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
new_user = form.save()
return HttpResponseRedirect("/accounts/profile/")
else:
form = UserCreationForm()
return render(request, "registration/register.html", {'form': form,})
urls.py
:
urlpatterns = patterns('',
(r'^accounts/login/$', login),
(r'^accounts/logout/$', logout),
(r'^accounts/profile/$', profile),
(r'^accounts/register/$', register),
)
我尝试删除db.sqlite3
文件并重新运行python manage.py syncdb
但我仍然收到此错误消息:
OperationalError at /accounts/register/
no such table: auth_user
Request Method: POST
Request URL: http://127.0.0.1:8000/accounts/register/
Django Version: 1.7b4
Exception Type: OperationalError
Exception Value:
no such table: auth_user
./manage.py migrate
如果您刚刚启用了所有中间件等,这将运行每个迁移并添加缺少的表。
您唯一需要做的就是:
python manage.py migrate
在那之后:
python manage.py createsuperuser
之后,您可以选择用户名和密码。
这是示例输出:
Username (leave blank to use 'hp'): admin
Email address: xyz@gmail.com
Password:
Password (again):
Superuser created successfully.
您可能会收到此错误,因为您使用的是UserCreationForm
,其中在META
中它包含User
(django.contrib.auth.models > User) 作为模型。
class Meta:
model = User
fields = ("username",)
在这里,您使用的是您自己的自定义身份验证模型,因此尚未创建与User
相关的表。 所以在这里你必须使用你自己的自定义模型。 在 Meta 类中,模型应该是您的User
(books.User)模型
这将适用于 django 版本 <1.7:
使用命令初始化表
manage.py syncdb
这允许您指定“超级用户”以及初始化任何表。
在创建超级用户之前需要进行迁移。
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
Username : admin
Password : 12345678
python manage.py runserver
在您为应用程序应用迁移之前,您的项目可能无法正常工作:admin、auth、contenttypes、sessions。 尝试运行
python manage.py migrate
然后运行
python manage.py createsuperuser
如果使用自定义身份验证模型,在您的 UserCreationForm 子类中,您必须同时覆盖元类和 clean_username 方法,因为它引用了硬编码的 User 类(后者直到 django 1.8)。
class Meta(UserCreationForm.Meta):
model = get_user_model()
def clean_username(self):
username = self.cleaned_data['username']
try:
self.Meta.model.objects.get(username=username)
except self.Meta.model.DoesNotExist:
return username
raise forms.ValidationError(
self.error_messages['duplicate_username'],
code='duplicate_username',
)
在创建自定义用户模型之前,必须执行第一次迁移。 然后安装您的用户模型的应用程序并添加 AUTH_USER_MODEL。
同样:
class UserForm(UserCreationForm):
class Meta:
model = User
fields = ("username",)
和
python manage.py migrate auth
python manage.py migrate
对于自定义表单(如果您制作了自己的表单),请使用此命令进行迁移
python manage.py migrate --run-syncdb
在 Django 1.11 上,我必须按照文档https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#substituting-a-custom-user-model中的说明执行此操作
# create default database:
./manage.py migrate
# create my custom model migration:
# running `./manage.py makemigrations` was not enough
./manage.py makemigrations books
# specify one-off defaults
# create table with users:
./manage.py migrate
只需执行以下流程
$ django-admin createproject <your project name>
在<your project dict>
下输入django-admin createapp <app name>
在<app name>/admin.py
下
from django.contrib import admin
from .models import Post
admin.site.register(Post)
转到根项目。 然后$python manage.py migrate
然后它要求输入用户名和密码
只需在注册用户之前执行迁移。
将自定义用户模型添加到 django 有四个步骤
您错过了自定义表单,将 CustomUser 和 CustomUserAdmin 添加到 admin.site.register() ,然后 makemigrations nd migrate 。
#proj_app/forms.py
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = get_user_model()
fields = ('email','username',)
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
fields = ('email', 'username',)
#proj_app/admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm , CustomUserChangeForm
CustomUser = get_user_model()
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
list_display = ['email','username',]
admin.site.register(CustomUser, CustomUserAdmin)
在这里,我们将现有的 UserAdmin 扩展到 CustomUserAdmin 并告诉 django 使用我们的新表单、自定义用户模型,并仅列出用户的电子邮件和用户名,我们还可以将更多现有的用户字段添加到 list_display
当我尝试在虚拟环境中部署我的 Django 网站之一时,我也遇到了同样的问题“没有这样的表:auth_user”。
这是我的解决方案,适用于我的情况:
在您定义数据库设置的 settings.py 文件中,如下所示:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(os.getcwd(), 'db.sqlite3'),
}
}
只需找到您的 db.sqlite3 数据库或您正在使用的任何其他数据库并写下数据库的完整路径,因此数据库设置现在看起来像这样;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/home/django/django_project/db.sqlite3',
}
}
我希望你的问题现在可以解决。
然后 python manage.py makemigrations → python manage.py migrate修复它。
假设在 settings.py 中定义/安装的应用程序存在于项目目录中。
请检查有多少 python 实例在后台运行,如 windows go---> 任务管理器并检查 python 实例并终止或结束任务,即终止所有 python 实例。 使用“py manage.py runserver”命令再次运行。 我希望它会正常工作....
如果您在项目/应用程序中进行了任何更改,请执行:
python manage.py migrate
python manage.py makemigrations
python manage.py createsuperuser
调用这些命令
python manage.py makemigrations
python manage.py migrate
我尝试了这种方法,它奏效了;
python manage.py 迁移
然后 python manage.py makemigrations
并运行 python manage.py createsuperuser
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.