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