我尝试使用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
有人可以解释并告诉我应该怎么做吗?
您可能会收到此错误,因为您使用的是UserCreationForm
模型,其中META
中包含User
(django.contrib.auth.models> User)作为模型。
class Meta:
model = User
fields = ("username",)
在这里,您使用自己的自定义身份验证模型,因此尚未创建与User
相关的表。所以在这里你必须使用自己的自定义模型。在Meta类中,模型应该是您的User
(books.User)模型
在创建自定义用户模型之前,必须先执行第一次迁移。然后安装用户模型的应用程序并添加AUTH_USER_MODEL。
同样:
class UserForm(UserCreationForm):
class Meta:
model = User
fields = ("username",)
和
python manage.py migrate auth
python manage.py migrate
在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
如果您对项目/应用程序进行了任何更改,则执行:
python manage.py migrate
python manage.py makemigrations
python manage.py createsuperuser
叫这些命令
python manage.py makemigrations
python manage.py migrate
./manage.py migrate
如果您刚刚启用了所有中间件等,则会运行每次迁移并添加缺少的表。
你唯一需要做的就是:
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.
这适用于django版本<1.7:
使用命令初始化表
manage.py syncdb
这允许您指定“超级用户”以及初始化任何表。
如果使用自定义身份验证模型,在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',
)
当我尝试在虚拟环境中部署我的一个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修复它。
Assuming Apps defined/installed in settings.py exist in the project directory.
请检查有多少python实例在后台运行,如在windows中运行--->任务管理器并检查python实例并杀死或结束任务,即杀死所有python实例。使用“py manage.py runserver”命令再次运行。我希望它能正常工作....
只需执行以下操作即可
$ 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
然后它要求输入用户名和密码