【问题标题】:OperationalError at / no such table: blog_postOperationalError at / no such table: blog_post
【发布时间】:2021-04-02 14:42:25
【问题描述】:

我正在用 Django 创建博客。但是当我运行我的程序时,它给了我这个错误: OperationalError at / 没有这样的表:blog_post。我尝试删除迁移和 db.sqlite3 表并运行迁移命令,但它没有工作。

这是我的代码:

models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
from taggit.managers import TaggableManager



class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager, self).get_queryset().filter(status='Published')


class Post(models.Model):
    STATUS_CHOICES = (
        ('Draft', 'Draft'),
        ('Published', 'Published')
    )

    title = models.CharField(max_length=255)
    body = models.TextField(null=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts', null=True)
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    slug = models.SlugField(max_length=255, unique_for_date='publish')
    status = models.CharField(max_length=15, choices=STATUS_CHOICES, default='Draft')
    tags = TaggableManager()


    objects = models.Manager()
    published = PublishedManager()

    def get_absolute_url(self):
        return reverse('detail', args=[self.publish.year,
                                    self.publish.month,
                                    self.publish.day, self.slug])
                                    
    def __str__(self):
        return self.title

    class Meta:
        ordering = ('-publish',)


class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="comments")       
    name = models.CharField(max_length=255)
    email = models.EmailField()
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)

    def __str__(self):
        return f"Comment by {self.name} on {self.post}"

    class Meta:
        ordering = ('-created',) 

views.py

from django.shortcuts import redirect, render, get_object_or_404
from django.core.mail import send_mail
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from taggit.models import Tag
from django.db.models import Count
from django.contrib.auth.decorators import login_required

from .models import Post, Comment
from .forms import EmailPostForm, CommentForm, CreateBlog


@login_required(login_url='login')
def index(request, tag_slug=None):
    object_list = Post.published.all()

    tag = None
    if tag_slug:
        tag = get_object_or_404(Tag, slug=tag_slug)
        object_list = object_list.filter(tags__in=[tag])

    paginator = Paginator(object_list, 10)

    page = request.GET.get('page') 
    try:
        posts = paginator.page(page)
    except EmptyPage:
        posts = paginator.page(1)
    except PageNotAnInteger:
        posts = paginator.page(paginator.num_pages)         

    context = {'posts': posts, 'page': page, 'tag': tag}
    return render(request, 'blog/index.html', context)


@login_required(login_url='login')
def detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post, status='Published',
                                    publish__year=year,
                                    publish__month=month,
                                    publish__day=day)

    comments = post.comments.filter(active=True)
    new_comment = None

    if request.method == "POST":
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            new_comment = comment_form.save(commit=False)
            new_comment.post = post
            new_comment.save()
    else:
        comment_form = CommentForm()  

    post_tags_ids = post.tags.values_list('id', flat=True)
    similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=post.id)
    similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags', '- 
                                                                             publish')[:4]       

    context = {'post': post, 'comments': comments, 'new_comment': new_comment, 'comment_form': 
               comment_form, 'similar_posts': similar_posts}
    return render(request, 'blog/detail.html', context)


@login_required(login_url='login')
def share(request, pk):
    post = get_object_or_404(Post, id=pk, status='Published')
    sent = False

    if request.method == "POST":
        form = EmailPostForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            post_url = request.build_absolute_uri(post.get_absolute_url())
            subject = f"{cd['name']} recommends you read {post.title}"
            message = f"Read {post.title} at {post_url}\n\n" \
                f"{cd['name']} comments: {cd['comments']}"
            send_mail(subject, message, 'aryansan123@zohomail.in', [cd['to']])   
            sent = True  
    else:
        form = EmailPostForm()

    context = {'form': form, 'sent': sent, 'post': post}            
    return render(request, 'blog/share.html', context)


def createBlog(request, pk):
    post = get_object_or_404(Post, id=pk)
    if request.method == "POST":
        form = CreateBlog(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.post = post
            form.save()
            return redirect('index')

    else:
        form = CreateBlog()

    context = {'form': form}
    return render(request, 'blog/create.html', context)

index.html

{% extends 'blog/base.html' %}

{% block content %}
<table class="table table-striped table-hover">
    <thead>
      <tr>
        <th scope="col">#</th>
        <th scope="col">Title</th>
        <th scope="col">User</th>
        <th scope="col">Status</th>
        <th scope="col">Tags</th>
      </tr>
    </thead>
    <tbody>
    {% if tag %}
      <h2>Posts tagged with "{{tag.name}}"</h2>
    {% endif %} 
    {% for post in posts %}
      <tr>
        <th scope="row">{{forloop.counter}}</th>
        <td><a href="{{post.get_absolute_url}}">{{post.title}}</a></td>
        <td>{{post.author.username}}</td>
        <td>{{post.status}}</td> 
        <td>
          <p class="tags">  
            Tags:
            {% for tag in post.tags.all %}
              <a href="{% url 'list_by_tag' tag.slug %}">{{tag.name}}</a>
              {% if not forloop.last %}, {% endif %}
            {% endfor %} 
          </p> 
        </td>  
      </tr>
    {% endfor %}  
    </tbody>
</table>
{% include 'blog/pagination.html' with page=posts %}
{% endblock %}  

urls.py

from django.urls import path

from . import views


urlpatterns = [
    path('', views.index, name="index"),
    path('tag/<slug:tag_slug>/', views.index, name="list_by_tag"),
    path('<int:year>/<int:month>/<int:day>/<slug:post>/', views.detail, name="detail"),
    path('<int:pk>/share/', views.share, name="share"),
    path('create/<int:pk>/', views.createBlog, name="create"),
]

我是 Django 新手。任何帮助将不胜感激。

【问题讨论】:

  • 您执行了哪个命令进行迁移?有没有错误?
  • 我使用了 python manage.py makemigrations,然后使用了 python manage.py migrate。不,没有任何关键错误。它只是说没有检测到变化。
  • @AdityaAryan 您是否完全删除了名为migrations 的文件夹/目录? (你不应该只删除迁移文件,缓存文件夹内的文件,还要确保不要删除__init__.py)。如果您这样做了,您可以使用python manage.py makemigrations &lt;appname&gt; 进行迁移(或者实际上自己添加文件夹以及其中的__init__.py
  • 是的,我不小心删除了迁移目录,但之后使用命令 python manage.py makemigrations 重新应用了迁移,但它仍然给我错误。
  • @AdityaAryan 那些 &lt;&gt; 标志只是占位符...运行 python manage.py makemigrations blog 然后运行 ​​python manage.py migrate

标签: python django


【解决方案1】:

1. 布鲁赫,我也有同样的错误。这是因为您尚未迁移模型。

2. 只需运行命令 python manage.py makemigrations

3. 然后运行 ​​python manage.py migrate 就可以了。

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 2020-05-28
    • 1970-01-01
    • 2022-06-15
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2022-07-22
    相关资源
    最近更新 更多