2010-11-15 3 views
1

J'utilise Django-nonrel sur Google App Engine. Je suis en train d'ajouter une ligne à la base de données mais je reçois cette erreur lorsque vous essayez d'utiliser save():Erreur d'insertion de données: littéral invalide pour int() avec base 10

invalid literal for int() with base 10

Voici mon code:

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}) 

modèles .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 

Edit: voici le backtrace

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'

Mon intuition me dit que le problème se situe quelque part autour de la façon dont je sauverai l'objet à la base de données. Peut-être la partie clé étrangère? Je ne peux pas identifier le problème depuis que j'ai commencé à apprendre Django récemment. Est-ce que ce problème a quelque chose à voir avec Django-nonrel utilisant le backend de GAE? Quelqu'un peut-il me dire où je me suis trompé ici?

+0

Le backtrace dont il aurait dû vous être très utile. –

+0

Je ne suis pas encore un expert en la matière, donc c'est assez difficile à comprendre par moi-même, même avec le backtrace actuel. Je vais l'ajouter ici et j'espère que quelqu'un pourra me dire où je me suis trompé. –

+0

Il y a assez d'informations pour obtenir ce qui est nécessaire (si les répondeurs ne l'ont pas utilisé), mais il est utile comme code (bouton 010101) plutôt que comme blockquote - il préserve les espaces et le formate plus gentiment . –

Répondre

5

Le problème est ici:

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

Vous avez oublié que Django ajoute un champ id automatique à la définition du modèle . Si vous avez fait cela dans le shell, puis imprimé saying.__dict__, vous verriez que le contenu a été affecté à id, la catégorie à content, et ainsi de suite.

Au lieu de cela, utilisez toujours des arguments de mots clés lors de l'instanciation d'un modèle:

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

OMG, j'ai complètement oublié le champ id automatique. Pas étonnant que je continue à avoir des erreurs. Je vous remercie! –

3

Création d'une instance comme celui-ci définira la clé primaire de votre modèle à content:

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

qui ne fonctionnera pas, parce que votre modèle a une clé primaire numérique, comme tous les modèles par défaut, à moins que vous Dites-lui explicitement d'utiliser un autre champ pour la clé primaire. Lorsque Django essaie d'appeler int() sur la valeur pour le convertir en entier, il se bloque avec une erreur de type.

Vous devriez plutôt utiliser des arguments de mots clés, comme ceci:

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

La façon idiomatiques pour ce faire, que vous voulez enregistrer l'objet de toute façon:

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