Django — OperationalError, нет такой таблицы: accounts_user

#python #django #sqlite #django-views #django-forms

#python #django #sqlite #django-просмотры #django-forms

Вопрос:

Я работаю над серверной частью Django для простого веб-сайта со списком дел. Веб-сайт проверяет подлинность пользователей, запрашивая у них адрес электронной почты, отправляя им ссылку с токеном, а затем используя этот токен для входа в систему, когда они нажимают на ссылку, перенаправляя их обратно на домашнюю страницу.

Когда я пытаюсь запустить сервер разработки, я всегда получаю сообщение на экране отладки OperationalError at / no such table: accounts_user . У меня есть два приложения, которые являются частью общего проекта, lists и accounts .

Решения подобных ошибок, с которыми я сталкивался в StackOverflow, не сработали для меня. Оба приложения перечислены в INSTALLED_APPS разделе core.settings . Я попытался удалить свою базу данных sqlite, все мои __pycache__ migrations папки и и запустить makemigrations и migrate снова, но безрезультатно. Я даже запустил его для accounts приложения и запустил его с помощью --run-syncdb , и это все равно не сработало.

Ошибка выдается во время рендеринга шаблона в строке 17 моего base.py , в частности, в той, которая гласит: {% if user.email %} .

Я использую Django 1.11.29 и Python 3.6.8. База данных представляет собой простой файл sqlite в каталоге проекта.

Вот мои модели и представления, а также базовый шаблон веб-сайта:

lists/models.py

 from django.db import models
from django.core.urlresolvers import reverse

class List(models.Model):
  def get_absolute_url(self):
    return reverse('view_list', args=[self.id])

class Item(models.Model):
  class Meta:
    ordering = ('id',)
    unique_together = ('list', 'text',)
  
  def __str__(self):
    return self.text
  
  text = models.TextField(default='')
  list = models.ForeignKey(List, default=None)
 

lists/views.py

 from django.shortcuts import redirect, render
from django.core.exceptions import ValidationError
from django.utils.html import escape

from lists.forms import ExistingListItemForm, ItemForm
from lists.models import Item, List

def home_page(request):
  return render(request, 'home.html', {'form': ItemForm()})

def new_list(request):
  form = ItemForm(data=request.POST)
  
  if form.is_valid():
    list_ = List.objects.create()
    form = ItemForm(data=request.POST)
    form.add_list(list_)
    form.save()
    return redirect(list_)
  else:
    return render(request, 'home.html', {"form": form})

def view_list(request, list_id):
  list_ = List.objects.get(id=list_id)
  form = ExistingListItemForm(for_list=list_)

  if request.method == 'POST':
    form = ExistingListItemForm(for_list=list_, data=request.POST)
    if form.is_valid():
      form.save()
      return redirect(list_)
  
  return render(request, 'list.html', {'list': list_, "form": form})
 

accounts/models.py

 import uuid

from django.contrib import auth
from django.db import models
from django.db.utils import OperationalError

try:
  auth.signals.user_logged_in.disconnect(auth.models.update_last_login)
except OperationalError:
  pass

class User(models.Model):
  email = models.EmailField(primary_key=True)
  
  REQUIRED_FIELDS = []
  USERNAME_FIELD = 'email'
  is_anonymous = False
  is_authenticated = True

class Token(models.Model):
  email = models.EmailField()
  uid = models.CharField(default=uuid.uuid4, max_length=40)
 

accounts/views.py

 import uuid

from django.contrib import auth
from django.db import models
from django.db.utils import OperationalError

try:
  auth.signals.user_logged_in.disconnect(auth.models.update_last_login)
except OperationalError:
  pass

class User(models.Model):
  email = models.EmailField(primary_key=True)
  
  REQUIRED_FIELDS = []
  USERNAME_FIELD = 'email'
  is_anonymous = False
  is_authenticated = True

class Token(models.Model):
  email = models.EmailField()
  uid = models.CharField(default=uuid.uuid4, max_length=40)
 

lists/templates/base.py

 <!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>To-Do lists</title>
    <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
    <link href="/static/base.css" rel="stylesheet">
  </head>
  <body>
    <div class"container">
      
      <nav class="navbar navbar-default" role="navigation">
        <div class="container-fluid">
          <a class="navbar-brand" href="/">Superlists</a>
          {% if user.email %}
            <ul class="nav navbar-nav navbar-right">
              <li class="navbar-text">Logged in as {{ user.email }}</li>
              <li><a href="#">Log out</a></li>
            </ul>
          {% else %}
            <form class="navbar-form navbar-right"
            method="POST"
            action="{% url 'send_login_email' %}">
              <span>Enter email to log in:</span>
              <input class="form-control" name="email" type="text" />
              {% csrf_token %}
            </form>
          {% endif %}
        </div>
      </nav>

      {% if messages %}
        <div class="row">
          <div class="col-md-8">
            {% for message in messages %}
              {% if message.level_tag == 'success' %}
                <div class="alert alert-success">{{ message }}</div>
              {% else %}
                <div class="alert alert-warning">{{ message }}</div>
              {% endif %}
            {% endfor %}
          </div>
        </div>
      {% endif %}

      <div class="row">
        <div class="col-md-6 col-md-offset-3 jumbotron">
          <div class="text-center">
            <h1>{% block header_text %}{% endblock %}</h1>
            <form method="POST" action="{% block form_action %}{% endblock %}">
              {{ form.text }}
              {% csrf_token %}
              {% if form.errors %}
                <div class="form-group has-errors">
                  <span class="help-block">{{ form.text.errors }}</span>
                </div>
              {% endif %}
            </form>
          </div>
        </div>
      </div>

      <div class="row">
        <div class="col-md-6 col-md-offset-3">
          {% block table %}
          {% endblock %}
        </div>
      </div>

    </div>
    <script src="/static/jquery-3.1.1.js"></script>
    <script src="/static/list.js"></script>

    <script>

      $(document).ready(function() {
        window.Superlists.initialize();
      });
      
    </script>

  </body>
</html>
 

Комментарии:

1. вы перенесли свое приложение accouts? python manage.py makemigrations accounts ?

2. @ha-neul да, я сделал

Ответ №1:

Если вы изменили некоторые имена в своем классе модели, проверьте, сохраняются ли эти имена в ваших файлах миграции, и, возможно, измените их вручную. Попробуйте выполнить миграцию еще раз и посмотрите, что произойдет.

В худшем случае удалите папку миграции и файл базы данных, выполните миграции и выполните повторную миграцию.

В некоторых случаях вам придется синхронизировать свою базу данных, поэтому добавьте эту команду после ключевого слова migrate --run-syncdb .