1

我在 Google App Engine 上使用 Django-nonrel。我正在尝试向数据库添加一行,但在尝试使用 save() 时出现此错误:

以 10 为底的 int() 的无效文字

这是我的代码:

视图.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

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)

表格.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

编辑:这是回溯

回溯:get_response 107 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/core/handlers/base.py”。 response = callback(request, *callback_args, **callback_kwargs)

_wrapped_view 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/contrib/auth/decorators.py” 25. return view_func(request, *args, **kwargs)

say_something 36 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/core/views.py”。saying.save()

保存 452 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/base.py”。 self.save_base(using=using, force_insert=force_insert, force_update=force_update )

save_base 550 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/base.py”。对于 meta.local_fields 中的 f]

内部 28 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py”。return func(*args, **kwargs)

内部 28 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py”。return func(*args, **kwargs)

get_db_prep_save 280 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/ init .py”。 return self.get_db_prep_value(value, connection=connection,prepared=错误的)

内部 53 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py”。 return func(*args, **kwargs)

get_db_prep_value 492 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/ init .py”。返回 connection.ops.value_to_db_auto(value)

value_to_db_auto 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/djangotoolbox/db/base.py” 68. return super(NonrelDatabaseOperations, self).value_to_db_auto(value)

value_to_db_auto 485 中的文件“/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/backends/ init .py”。return int(value)

异常类型:/contribute/ 处的 ValueError 异常值:int() 的无效文字,基数为 10:'test'

我的直觉告诉我,问题在于我如何将对象保存到数据库中。也许是外键部分?因为我最近才开始学习 Django,所以我无法查明问题所在。这个问题与使用 GAE 后端的 Django-nonrel 有什么关系吗?谁能告诉我这里哪里出错了?

4

2 回答 2

5

问题在这里:

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

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

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

saying = Saying(content=content, 
                category=category, 
                added_date=added_date, 
                added_user=added_user)
于 2010-11-15T11:55:06.627 回答
3

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

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

这不起作用,因为您的模型具有数字主键,默认情况下所有模型都具有数字主键,除非您明确告诉它使用其他字段作为主键。当 Django 尝试调用int()该值以将其转换为整数时,它会因类型错误而崩溃。

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

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

这样做的惯用方法,因为您无论如何都想保存对象:

saying = Saying.objects.create(content = content, ... = ..)
于 2010-11-15T11:50:10.967 回答