Django:html模板的操作错误和“没有这样的表”

Posted

技术标签:

【中文标题】Django:html模板的操作错误和“没有这样的表”【英文标题】:Django: Operational Error with html template and "no such table" 【发布时间】:2018-01-12 23:10:34 【问题描述】:

我正在学习 Obeythetestinggoat.com(Win7、Django 1.11、Python 3.6.1)的教程,但在尝试手动访问本地站点时遇到了一些问题。当我在 Chrome 浏览器窗口中运行 python manage.py runserver 并打开 localhost:8000 时,出现以下错误:

django.db.utils.OperationalError: no such table: accounts_user

浏览器窗口中的输出显示有Error during template rendering

这是它试图渲染的模板的 sn-p:

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

我相信问题来自% user.email %,因为这些特定错误直到我将它们添加到模板中才出现。虽然,这似乎有些奇怪:

    我的所有功能测试都顺利通过。

    % messages % 没有任何问题。抱歉我没有 知道这些% things % 被调用了。

    makemigrationsmigrate 没有帮助。

这是accounts 应用程序的views.py

from django.shortcuts import redirect
from django.contrib import auth, messages
from django.core.mail import send_mail
from django.core.urlresolvers import reverse
from accounts.models import Token


def send_login_email(request):
    email = request.POST['email']
    token = Token.objects.create(email=email)
    url = request.build_absolute_uri(
        reverse('login') + '?token=' + str(token.uid)
    )
    message_body = f'Use this link to log in:\n\nurl'
    send_mail(
        'your login link for Superlists',
        message_body,
        'noreply@superlists',
        [email]
    )

    messages.success(
        request,
        "Check your email, we've sent you a link you can use to log in.")
    return redirect('/')

def login(request):
    user = auth.authenticate(uid=request.GET.get('token'))
    if user:
        auth.login(request, user)
    return redirect('/')

这是accounts 应用程序的models.py

from django.contrib import auth
from django.db import models
import uuid

auth.signals.user_logged_in.disconnect(auth.models.update_last_login)

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)

【问题讨论】:

【参考方案1】:

您是否通过 python 控制台运行过 makemigration 和 migrate 命令?我想您的模型更改尚未填充到您的数据库中。

$ python manage.py makemigrations your_app_label

然后运行

$ python manage.py migrate

您可以在这里阅读更多内容https://docs.djangoproject.com/en/1.11/topics/migrations/

【讨论】:

是的,我都试过了,它说no changes detected in 'accounts',还有no migrations to apply【参考方案2】:

我在同一本书的同一部分遇到了同样的问题。虽然错误在登录前在 Chrome 中弹出,但它会在登录后在每个浏览器中弹出。这是一个数据库问题,只有在您手动运行服务器时才会弹出。

要修复,请使用:

python manage.py makemigrations
python manage.py migrate

如果您对 migrate 有任何错误,请擦除您的测试数据库并再次运行迁移:

rm db.sqlite3
python manage.py migrate --noinput

【讨论】:

以上是关于Django:html模板的操作错误和“没有这样的表”的主要内容,如果未能解决你的问题,请参考以下文章

Django 启动代码(如初始缓存)冲突 makemigrations。操作错误没有这样的列表

Django模板扩展了错误的模板

Django CMS - 创建第一页时模板不存在错误

Django 2.0 - 渲染错误的模板(没有错误)

Django模板过滤器不断给出“不支持的操作数类型”

Django 自定义 500 错误模板不显示 request.user