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

问题描述 投票:23回答:12

我尝试使用Django的默认Auth来处理注册和登录。而且我觉得这个程序很标准,但我的错误。

我的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和re 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

有人可以解释并告诉我应该怎么做吗?

python django authentication authorization
12个回答
16
投票

Update

您可能会收到此错误,因为您使用的是UserCreationForm模型,其中META中包含User(django.contrib.auth.models> User)作为模型。

class Meta:
    model = User
    fields = ("username",)

在这里,您使用自己的自定义身份验证模型,因此尚未创建与User相关的表。所以在这里你必须使用自己的自定义模型。在Meta类中,模型应该是您的User(books.User)模型


0
投票

在创建自定义用户模型之前,必须先执行第一次迁移。然后安装用户模型的应用程序并添加AUTH_USER_MODEL。

同样:

class UserForm(UserCreationForm):

    class Meta:
        model = User
        fields = ("username",)

python manage.py migrate auth
python manage.py migrate

0
投票

在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

0
投票

如果您对项目/应用程序进行了任何更改,则执行:

python manage.py migrate
python manage.py makemigrations
python manage.py createsuperuser

0
投票

叫这些命令

python manage.py makemigrations
python manage.py migrate

55
投票
./manage.py migrate

如果您刚刚启用了所有中间件等,则会运行每次迁移并添加缺少的表。


20
投票

你唯一需要做的就是:

python manage.py migrate

在那之后:

python manage.py createsuperuser

之后,您可以选择用户名和密码。

这是示例输出:

Username (leave blank to use 'hp'): admin
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.

12
投票

这适用于django版本<1.7:

使用命令初始化表

manage.py syncdb

这允许您指定“超级用户”以及初始化任何表。


3
投票

如果使用自定义身份验证模型,在UserCreationForm子类中,您必须覆盖metaclass和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',
        )

1
投票

当我尝试在虚拟环境中部署我的一个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',
    }
}  

我希望你的问题现在能解决。


1
投票

python manage.py makemigrations然后→python manage.py migrate修复它。

Assuming Apps defined/installed in settings.py exist in the project directory.

1
投票

请检查有多少python实例在后台运行,如在windows中运行--->任务管理器并检查python实例并杀死或结束任务,即杀死所有python实例。使用“py manage.py runserver”命令再次运行。我希望它能正常工作....


1
投票

只需执行以下操作即可

$ 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

然后它要求输入用户名和密码

© www.soinside.com 2019 - 2024. All rights reserved.