数据插入错误:以10为基数的int()的文本无效

2024-10-03 17:23:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在谷歌应用引擎上使用Django nonrl。我试图向数据库中添加一行,但在尝试使用save()时遇到以下错误:

invalid literal for int() with base 10

我的代码是:

在视图.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})

在模型.py在

^{pr2}$

在表单.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

编辑:这是回溯

Traceback: File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/core/handlers/base.py" in get_response 107. response = callback(request, *callback_args, **callback_kwargs)

File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/contrib/auth/decorators.py" in _wrapped_view 25. return view_func(request, *args, **kwargs)

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

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

File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/base.py" in save_base 550. for f in meta.local_fields]

File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py" in inner 28. return func(*args, **kwargs)

File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py" in inner 28. return func(*args, **kwargs)

File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/init.py" in get_db_prep_save 280. return self.get_db_prep_value(value, connection=connection, prepared=False)

File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py" in inner 53. return func(*args, **kwargs)

File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/init.py" in get_db_prep_value 492. return connection.ops.value_to_db_auto(value)

File "/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/djangotoolbox/db/base.py" in value_to_db_auto 68. return super(NonrelDatabaseOperations, self).value_to_db_auto(value)

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

Exception Type: ValueError at /contribute/ Exception Value: invalid literal for int() with base 10: 'test'

我的直觉告诉我,问题出在如何将对象保存到数据库的某个地方。可能是外键部分?因为我最近才开始学习Django,所以我无法确定问题所在。这个问题与使用GAE后端的Django nonrl有关吗?谁能告诉我我哪里出错了吗?在


Tags: todjangoinpyhomedbreturnvalue
2条回答

问题在于:

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

您忘记了Django向模型定义添加了一个自动的id字段。如果在shell中执行此操作,然后打印saying.__dict__,您将看到内容已分配给id,类别分配给content,依此类推。在

相反,在实例化模型时始终使用关键字参数:

^{pr2}$

创建这样的实例会将模型的主键设置为content

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

这行不通,因为您的模型有一个数字主键,默认情况下所有模型也是如此,除非您明确告诉它使用其他字段作为主键。当Django试图对该值调用int()将其强制转换为整数时,它将崩溃,并出现类型错误。在

您应该改为使用关键字参数,如下所示:

^{pr2}$

当您想保存对象时,惯用的方法是:

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

相关问题 更多 >