таблица не имеет столбца с именем error при попытке добавить страницу на сайт - PullRequest
0 голосов
/ 21 марта 2019
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

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

I 'Я не уверен, почему эта ошибка происходит.Заранее благодарим за любую помощь.

1 Ответ

0 голосов
/ 21 марта 2019

Редактировали ли вы models.py после запуска makemigrations?

Если это так, то вы должны удалить свою базу данных и миграции из своего приложения (не удаляйте init .py), а затем запустить:

python3 manage.py makemigrations

затем

python3 manage.py migrate
...