Ошибка вставки данных: неверный литерал для int () с основанием 10 - PullRequest
1 голос
/ 15 ноября 2010

Я использую Django-nonrel в Google App Engine.Я пытаюсь добавить строку в базу данных, но получаю эту ошибку при попытке использовать save ():

недопустимый литерал для int () с базой 10

Вот мой код:

views.py

from django import forms
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from forms import SayForm
from models import Saying, Category
import datetime

def say_something(request):
if request.method == 'POST':
    form = SayForm(request.POST)
    if form.is_valid():
        cd = form.cleaned_data
        content = cd['content']
        category_temp = "Uncategorized"
        category = Category.objects.get(name = category_temp)
        added_date = datetime.datetime.now()
        added_user = request.user
        saying = Saying(content, category, added_date, added_user)
        saying.save()
        return HttpResponseRedirect('/contribute/success')
else:
    form = SayForm()
return render_to_response('say_form.html', {'form' : form})

models.py

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

class Category(models.Model):
    name = models.CharField(max_length = 50)

    def __unicode__(self):
        return self.name

class Saying(models.Model):
    content = models.CharField(max_length = 160)
    category = models.ForeignKey(Category)
    added_date = models.DateField()
    added_user = models.ForeignKey(User)

forms.py

from django import forms

class SayForm(forms.Form):
    content = forms.CharField(widget = forms.Textarea)

    def clean_message(self):
        content = self.cleaned_data['content']
        num_characters = len(content)
        if num_characters > 160:
            raise forms.ValidationError("Please limit your saying to 160 characters only.")
        num_words = len(content.split())
        if num_words < 4:
            raise forms.ValidationError("This doesn't make sense. Say something longer.")
        return content

Редактировать: вотобратная трассировка

Трассировка: файл "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/core/handlers/base.py" в get_response 107. response =обратный вызов (запрос, * callback_args, ** callback_kwargs)

Файл "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/contrib/auth/decorators.py" в _wrapped_view25. вернуть view_func (request, * args, ** kwargs)

File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/core/views.py" в say_something 36. say.save ()

Файл "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/base.py" в save 452. self.save_base (using = using, force_insert = force_insert, force_update = force_update)

Файл "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/base.py«в save_base 550. для f в meta.local_fields]

File» /home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py«во внутреннем 28. вернуть func (* args, ** kwargs)

File» / home / eeyorexd / workspace / Python / appengine / что-то сказать / что-то сказать / django / db / models / fields /subclassing.py "во внутреннем 28. вернуть func (* args, ** kwargs)

File" / home / eeyorexd / workspace / Python / appengine / что-то сказать / что-то сказать / что-то сказать / django / db / models/fields/init.py "в get_db_prep_save 280. вернуть self.get_db_prep_value (значение, соединение = соединение, подготовлено = False)

Файл" / home / eeyorexd / workspace / Python / appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py "во внутреннем 53. return func (* args, ** kwargs)

Файл "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/init.py" в get_db_prep_value 492. возврат соединения.ops.value_to_db_auto (значение)

Файл "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/djangotoolbox/db/base.py" в value_to_db_auto 68. return superperation, self) .value_to_db_auto (значение)

Файл "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/backends/init.py"in value_to_db_auto 485. return int (value)

Тип исключения: ValueError at / contrib / Exception Value: недопустимый литерал для int () с основанием 10: 'test'

MyВнутреннее чувство говорит мне, что проблема заключается где-то в том, как я сохраняю объект в базе данных.Может быть, часть внешнего ключа?Я не могу точно определить проблему, так как я недавно начал изучать Джанго.Связана ли эта проблема с Django-nonrel, использующим бэкэнд GAE?Кто-нибудь может сказать мне, где я ошибся здесь?

Ответы [ 2 ]

5 голосов
/ 15 ноября 2010

Проблема здесь:

saying = Saying(content, category, added_date, added_user)

Вы забыли, что Django добавляет автоматическое поле id в определение модели. Если вы сделали это в оболочке, а затем напечатали saying.__dict__, вы увидите, что контенту присвоен id, категории - content и т. Д.

Вместо этого всегда используйте ключевые аргументы при создании экземпляра модели:

saying = Saying(content=content, 
                category=category, 
                added_date=added_date, 
                added_user=added_user)
3 голосов
/ 15 ноября 2010

При создании такого экземпляра первичный ключ вашей модели будет установлен на content:

saying = Saying(content, category, added_date, added_user)

Это не сработает, поскольку ваша модель имеет первичный числовой ключ, как и все модели по умолчанию, если вы явно не укажете ей использовать какое-либо другое поле для первичного ключа. Когда Django пытается вызвать int() для значения, чтобы привести его к целому числу, происходит сбой с ошибкой типа.

Вместо этого вы должны использовать ключевые аргументы, например:

saying = Saying(content = content, ... = ...)

Идиоматический способ сделать это, так как вы все равно хотите сохранить объект:

saying = Saying.objects.create(content = content, ... = ..)
...