首页 > 解决方案 > 尝试将页面添加到站点时,表没有名为错误的列

问题描述

from django.shortcuts import render
from django.http import HttpResponse
from rango.models import Category
from rango.models import Page
from rango.forms import CategoryForm
from rango.forms import PageForm
from rango.forms import UserForm, UserProfileForm
from django.contrib.auth import authenticate, login
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import login_required
from django.contrib.auth import logout
from datetime import datetime


def index(request):

    request.session.set_test_cookie()

    category_list = Category.objects.order_by('-name')[:5]
    context_dict = {'categories': category_list}

    visitor_cookie_handler(request)

    response = render(request, 'rango/index.html', context_dict)

    return response


def about(request):

    if request.session.test_cookie_worked(): 
        print("TEST COOKIE WORKED!") 
        request.session.delete_test_cookie()


    context_dict = {'MEDIA_URL': "/media/"}

    visitor_cookie_handler(request)
    context_dict['visits'] = request.session['visits']

    return render(request, 'rango/about.html', context=context_dict)


def show_category(request, category_name_slug):

    context_dict = {}
    try:
        category = Category.objects.get(slug=category_name_slug)
        pages = Page.objects.filter(category=category)
        context_dict['category'] = category

    except Category.DoesNotExist: 

        context_dict['category'] = None
        #context_dict['pages'] = None


    return render(request, 'rango/category.html', context_dict)


def add_category(request): 

    form = CategoryForm()
    if request.method == 'POST':
        form = CategoryForm(request.POST)


        if form.is_valid():

            form.save(commit=True)

            return index(request)
        else:

            print(form.errors)

    return render(request, 'rango/add_category.html', {'form': form})


def add_page(request, category_name_slug):
    try:
        category = Category.objects.get(slug=category_name_slug)
    except Category.DoesNotExist:
        category = None

    form = PageForm()
    if request.method == 'POST':
        form = PageForm(request.POST)
        if form.is_valid(): 
            if category: 
                page = form.save(commit=False)
                page.category = category
                page.save()
                return show_category(request, category_name_slug)
        else:
            print(form.errors)

    context_dict = {'form':form, 'category': category}
    return render(request, 'rango/add_page.html', context_dict)


def register(request):

    registered = False


    if request.method == 'POST':

        user_form = UserForm(data=request.POST)
        profile_form = UserProfileForm(data=request.POST)


        if user_form.is_valid() and profile_form.is_valid(): 

            user = user_form.save()


            user.set_password(user.password)
            user.save()


            profile = profile_form.save(commit=False)
            profile.user = user

        #   if 'picture' in request.FILES:
        #       profile.picture = request.FILES['picture'] 


            profile.save()
            username = user_form.cleaned_data['username']
            password = user_form.cleaned_data['password']
            user = authenticate(username=username, password=password)


            registered = True
        else:

            print(user_form.errors, profile_form.errors)
    else:

        user_form = UserForm()
        profile_form = UserProfileForm()

    return render(request, 'rango/register.html',
                    {'user_form': user_form,
                    'profile_form': profile_form,
                    'registered': registered})


def show_restaurant(request, restaurant_name_slug):

    context_dict = {}
    try:

        restaurant = Restaurant.objects.get(slug=category_name_slug)


        reviews = Review.objects.filter(restaurant=restaurant)


        context_dict['reviews'] = reviews

        context_dict['restaurant'] = restaurant
    except Restaurant.DoesNotExist: 

        context_dict['restaurant'] = None
        context_dict['reviews'] = None


    return render(request, 'rango/restaurant.html', context_dict)                   

def user_login(request):

    if request.method == 'POST':

        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)

        if user:

            if user.is_active:

                login(request, user)
                return HttpResponseRedirect(reverse('index'))
            else:

                return HttpResponse("Your Rango account is disabled.")
        else:
            . 
            print("Invalid login details: {0}, {1}".format(username, password)) 
            return HttpResponse("Invalid login details supplied. Incorrect username or password")


    else:
        return render(request, 'rango/login.html', {})


@login_required
def restricted(request):
    restricted = {'restricted' : 'Since youre logged in, you can see this text!'}
    return render(request, 'rango/restricted.html')

以上是我的views.py,这是我的models.py

from django.db import models
from django.template.defaultfilters import slugify
from django.contrib.auth.models import User


class Category(models.Model):
    name = models.CharField(max_length=128, unique=True)
    likes = models.IntegerField(default=0)
    slug = models.SlugField(unique = True)

    def save(self, *args, **kwargs): 
        self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)


    class Meta:
        verbose_name_plural = 'Categories'


    def __str__(self): 
        return self.name

class Page(models.Model):
    category = models.ForeignKey(Category)
    title = models.TextField(max_length=128)
    address = models.TextField(max_length=128)
    telephone = models.IntegerField(blank=True)
    picture = models.ImageField(upload_to='profile_images/', blank=True, max_length=1000)
    slug = models.SlugField(unique=True)
    views = models.IntegerField(default=0)

    #def save(self, *args, **kwargs): 
    #changed self.name to self.title
    #   self.slug = slugify(self.title)
    #   super(Category, self).save(*args, **kwargs)

    class Meta:
        verbose_name_plural = 'Pages'

    def __str__(self): 
        return self.title



class UserProfile(models.Model):

    user = models.OneToOneField(User)

    def __str__(self):
        return self.user.username

表格.py:

from django import forms
from django.contrib.auth.models import User
from rango.models import Page, Category, UserProfile

class CategoryForm(forms.ModelForm):
    name = forms.CharField(max_length=128, help_text="Please enter the category name.")
    likes = forms.IntegerField(widget=forms.HiddenInput(), initial=0)
    slug = forms.CharField(widget=forms.HiddenInput(), required=False)


    class Meta:

        model = Category
        fields = ('name',)

class PageForm(forms.ModelForm):
    title = forms.CharField(required=True, help_text="Please enter the title of the page.")
    address = forms.CharField()
    telepohne = forms.IntegerField(help_text="Please enter the phone number of the restaurant if there is one")
    views = forms.IntegerField(widget=forms.HiddenInput(), initial=0)

    class Meta:

        model = Page
        exclude = ('category',)
        fields = ('title', 'picture', 'address', 'telephone')



class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta: 
        model = User
        fields = ('username', 'email', 'password')

class UserProfileForm(forms.ModelForm): 
    class Meta:
        model = UserProfile
        exclude = ('user',)

我想添加一个功能来添加一个包含用户输入的餐厅数据的新网页。当我填写字段以添加新页面并按提交时,我在网站上收到以下错误:

OperationalError at /rango/category/test/add_page/
table rango_page has no column named address
Request Method: POST
Request URL:    http://127.0.0.1:8000/rango/category/test/add_page/
Django Version: 1.11.17
Exception Type: OperationalError
Exception Value:    
table rango_page has no column named address
Exception Location: C:\ProgramData\Anaconda2\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 328
Python Executable:  C:\ProgramData\Anaconda2\python.exe
Python Version: 2.7.15
Python Path:    
['H:\\WADpp\\WAD2-current',
 'C:\\ProgramData\\Anaconda2\\python27.zip',
 'C:\\ProgramData\\Anaconda2\\DLLs',
 'C:\\ProgramData\\Anaconda2\\lib',
 'C:\\ProgramData\\Anaconda2\\lib\\plat-win',
 'C:\\ProgramData\\Anaconda2\\lib\\lib-tk',
 'C:\\ProgramData\\Anaconda2',
 'C:\\ProgramData\\Anaconda2\\lib\\site-packages',
 'C:\\ProgramData\\Anaconda2\\lib\\site-packages\\win32',
 'C:\\ProgramData\\Anaconda2\\lib\\site-packages\\win32\\lib',
 'C:\\ProgramData\\Anaconda2\\lib\\site-packages\\Pythonwin']

以及终端上的以下错误

Internal Server Error: /rango/category/test/add_page/
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "H:\WADpp\WAD2-current\rango\views.py", line 128, in add_page
    page.save()
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\models\base.py", line 808, in save
    force_update=force_update, update_fields=update_fields)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\models\base.py", line 838, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\models\base.py", line 924, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\models\base.py", line 963, in _do_insert
    using=using, raw=raw)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\models\query.py", line 1079, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\models\sql\compiler.py", line 1112, in execute_sql
    cursor.execute(sql, params)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\backends\utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\ProgramData\Anaconda2\lib\site-packages\django\db\backends\sqlite3\base.py", line 328, in execute
    return Database.Cursor.execute(self, query, params)
OperationalError: table rango_page has no column named address

为什么会出现这个错误?我该如何解决?

标签: djangodjango-modelsdjango-formsdjango-templatesdjango-views

解决方案


你在运行 makemigrations 后编辑了 models.py 吗?

如果是这样,那么您应该从您的应用程序中删除您的数据库和迁移(不要删除init .py)然后运行:

python3 manage.py makemigrations

然后

python3 manage.py migrate

推荐阅读