1

GoogleAppEngineでDjango-nonrelを使用しています。データベースに行を追加しようとしていますが、save()を使用しようとすると次のエラーが発生します。

10進数のint()のリテラルが無効です

これが私のコードです:

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

編集:これがバックトレースです

トレースバック:get_response107のファイル"/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/core/handlers/base.py"。response= callback(request、* callback_args、** callback_kwargs)

_wrapped_view25のファイル"/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/contrib/auth/decorators.py"。returnview_func(request、* args、** kwargs)

ファイル"/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/core/views.py"in say_something 36.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 )。

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

内部28のファイル「/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py」。returnfunc(* args、** kwargs)

内部28のファイル「/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py」。returnfunc(* args、** kwargs)

ファイル"/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)

内部53のファイル「/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/subclassing.py」。returnfunc(* args、** kwargs)

get_db_prep_value492のファイル"/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/django/db/models/fields/ init .py"。returnconnection.ops.value_to_db_auto(value)

value_to_db_auto68のファイル"/home/eeyorexd/workspace/Python/appengine/something-to-say/somethingtosay/djangotoolbox/db/base.py"。returnsuper(NonrelDatabaseOperations、self).value_to_db_auto(value)

value_to_db_auto485のファイル"/home / eeyorexd / worksheet / Python / appengine / something-to-say / somethingtosay / django / db / backends / init .py"。returnint(value)

例外タイプ:/ contribute /でのValueError例外値:10進数のint()の無効なリテラル:'test'

私の直感は、問題はオブジェクトをデータベースに保存する方法のどこかにあることを教えてくれます。多分外部キー部分?最近Djangoを学び始めたばかりなので、問題を特定することはできません。この問題は、GAEのバックエンドを使用するDjango-nonrelと関係がありますか?ここでどこが間違っていたのか誰か教えてもらえますか?

4

2 に答える 2

5

問題はここにあります:

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

idDjangoがモデル定義に自動フィールドを追加することを忘れてしまいました。これをシェルで実行してから印刷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)

モデルには数値の主​​キーがあるため、これは機能しません。主キーに他のフィールドを使用するように明示的に指示しない限り、デフォルトではすべてのモデルが機能します。Djangoint()が値を呼び出して整数にキャストしようとすると、型エラーでクラッシュします。

代わりに、次のようなキーワード引数を使用する必要があります。

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

とにかくオブジェクトを保存したいので、これを行う慣用的な方法:

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