django: регистрация пользователя с ошибкой: нет такой таблицы: auth user
Я пытаюсь использовать аутентификацию Django по умолчанию для обработки регистрации и входа. И я думаю, что процедура довольно стандартная, но моя с sth неправильная.
мой 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
может кто-нибудь объяснить и рассказать мне, что я должен делать?
11 ответов
обновление
вы, вероятно, получаете эту ошибку, потому что вы используете UserCreationForm
modelform, в котором в META
содержит User
(Джанго.ВНО.автор.модели > пользователь) как модель.
class Meta:
model = User
fields = ("username",)
и здесь вы используете свою собственную модель auth, поэтому таблицы, связанные с User
не был создан. Так вот вы должны использовать свой собственный modelform. где в мета-классе модель должна быть вашей User
(книги.Пользователь) модель
./manage.py migrate
Если вы только что включили все промежуточные программы и т. д., это запустит каждую миграцию и добавит отсутствующие таблицы.
Это кажется очень элементарным, но вы инициализировали таблицы командой
manage.py syncdb
Это позволяет назначить "суперпользователя", а также инициализировать любые таблицы.
единственное, что вам нужно сделать, это :
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 вам придется переопределить метод metaclass и clean_username, поскольку он ссылается на жестко закодированный класс пользователя (последний только до 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',
)
python manage.py затем makemigrations → python manage.py migrate фиксирует его.
предполагая, что приложения определены/установлены в settings.py существует в каталоге проекта.
просто сделайте следующий поток
$ 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
затем он запрашивает имя пользователя и пароль
Я также столкнулся с той же проблемой "нет такой таблицы: auth_user", когда я пытаюсь развернуть мой сайт Django в виртуальное окружение.
вот мое решение, которое сработало в моем случае:
в вашем settings.py файл, в котором вы определили свой параметр базы данных следующим образом:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(os.getcwd(), 'db.sqlite3'),
}
}
просто найдите свою БД.база данных sqlite3 или любая другая база данных, которую вы используете, и запишите полный путь к вашей базе данных , поэтому теперь параметр базы данных будет выглядеть что-то вроде этого ;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/home/django/django_project/db.sqlite3',
}
}
Я надеюсь, что ваша проблема будет решена сейчас.
перед созданием пользовательской модели пользователя необходимо выполнить первую миграцию. Затем установите приложение вашей модели пользователя и добавьте AUTH_USER_MODEL.
а также:
class UserForm(UserCreationForm):
class Meta:
model = User
fields = ("username",)
и
python manage.py migrate auth
python manage.py migrate
пожалуйста, проверьте, сколько экземпляров python работают в фоновом режиме, как в windows go- - - >диспетчер задач и проверить экземпляры python и убить или завершить задачу i.e убить все экземпляры python. запустите снова, используя "py manage.py команда "runserver". надеюсь, все будет хорошо....
на 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