繁体   English   中英

用户注册错误:没有这样的表:auth_user

[英]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 有四个步骤

  1. 创建一个 CustomUser 模型
  2. 更新项目/settings.py AUTH_USER_MODEL
  3. 自定义 UserCreationForm 和 UserChangeForm
  4. 将自定义用户模型添加到 admin.py

您错过了自定义表单,将 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM