#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
.