/ / Le champ du modèle Django avec la valeur par défaut définie ne viole pas la contrainte non nulle lors de l'enregistrement - django, django-models, django-forms

Le champ du modèle Django avec la valeur par défaut définie ne viole pas la contrainte non nulle lors de l'enregistrement - django, django-models, django-forms

Mon champ:

signup_date = models.DateTimeField(blank=True,default=datetime.now)

Mon erreur lors de l'enregistrement:

IntegrityError: null value in column "signup_date" violates not-null constraint

J'essaie de faire un test unitaire simple où je crée une instance liée d'un ModelForm à partir d'un dict et je l'enregistre.

Merci.

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/django/signupform/signup/insert_test_data.py", line 27, in <module>
SDF.save()
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/forms/models.py", line 371, in save
fail_message, commit, construct=False)
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/forms/models.py", line 86, in save_instance
instance.save()
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/base.py", line 435, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/base.py", line 528, in save_base
result = manager._insert(values, return_id=update_pk, using=using)
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/manager.py", line 195, in _insert
return insert_query(self.model, values, **kwargs)
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/query.py", line 1479, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/sql/compiler.py", line 783, in execute_sql
cursor = super(SQLInsertCompiler, self).execute_sql(None)
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/models/sql/compiler.py", line 727, in execute_sql
cursor.execute(sql, params)
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/backends/util.py", line 15, in execute
return self.cursor.execute(sql, params)
File "/usr/lib/python2.5/site-packages/Django-1.2.1-py2.5.egg/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute
return self.cursor.execute(query, args)
IntegrityError: null value in column "signup_date" violates not-null constraint




from django.db import models
from django.contrib.localflavor.us.models import PhoneNumberField
from datetime import datetime
from models_dropdowns import *

class SignupData(models.Model):
first_name = models.CharField(max_length=128,verbose_name="First Name")
last_name = models.CharField(max_length=128,verbose_name="Last Name")
street1 = models.CharField(max_length=128,verbose_name="Street Address 1")
street2 = models.CharField(max_length=128,verbose_name="Street Address 2")
city = models.CharField(max_length=128)
state = models.CharField(max_length=2)
zip = models.IntegerField(verbose_name="Zip Code")
phone_number = PhoneNumberField(verbose_name="Phone Number XXX-XXX-XXXX")
email = models.EmailField(verbose_name="Email Address")
contact_method = models.ForeignKey("ContactMethodChoice",blank=False,default=-1,verbose_name="Preferred contact method")
birth_date = models.DateField(verbose_name="Birth Date")
policy_number = models.CharField(max_length=128,verbose_name="American Family Auto Insurance Policy Number")
vin = models.CharField(max_length=128,verbose_name="Vehicle Identification Number (VIN)")
vehicle_make = models.ForeignKey("VehicleMakeChoice",verbose_name="VehicleMake")
vehicle_model = models.CharField(max_length=128,verbose_name="Vehicle Model")
vehicle_year = models.ForeignKey("VehicleYearChoice",verbose_name="Vehicle Year")
vehicle_ownership = models.ForeignKey("VehicleOwnershipChoice",blank=False,default=-1,verbose_name="Vehicle Ownership")
vehicle_use = models.ForeignKey("VehicleUseChoice",blank=False,default=-1,verbose_name="Use of Vehicle")
terms_and_conditions = models.BooleanField(verbose_name="I Agree to the terms and conditions. (add link)")
form_user_role = models.ForeignKey("FormUserRoleChoice",blank=False,default=-1,verbose_name="Your Role")
participate_in_feedback = models.BooleanField(verbose_name="<b>Opportunity to provide feedback.</b>...<br><br>",help_text="Please check the box if you would like to participate.")
signup_date = models.DateTimeField(blank=True,default=datetime.now,verbose_name="")

J'utilise le code suivant pour créer une instance liée du formulaire et l'enregistrer. Je lance cela en l'important depuis le shell ./manage.py.

from signupform.signup.forms import SignupDataForm

keys =      ("first_name","last_name","street1","street2","city","state","zip","phone_number","email","contact_method","birth_date","policy_number","vin","vehicle_make","vehicle_model","vehicle_year","vehicle_ownership","vehicle_use","terms_and_conditions","form_user_role","participate_in_feedback")

data = [
("firstname1","lastname1","test1","test1","test1","XX",55555,"555-555-5555","test@asdf.com",1,"01/01/01","####-####-##-##-AAAA-AA","123456789abcdefgh",1,"model",1996,1,1,True,1,True),
("firstname2","lastname2","test2","test2","test2","XX",55555,"555-555-5555","test@asdf.com",1,"01/01/01","####-####-##-##-AAAA-AA","123456789abcdefgh",1,"model",1996,1,1,True,1,True),
("firstname3","lastname3","test3","test3","test3","XX",55555,"555-555-5555","test@asdf.com",1,"01/01/01","####-####-##-##-AAAA-AA","123456789abcdefgh",1,"model",1996,1,1,True,1,True),
("firstname4","lastname4","test4","test4","test4","XX",55555,"555-555-5555","test@asdf.com",1,"01/01/01","####-####-##-##-AAAA-AA","123456789abcdefgh",1,"model",1996,1,1,True,1,True),
]

for d in data:
tmpDict = {}
for i in range(0,len(keys)):
tmpDict[keys[i]] = d[i]
SDF = SignupDataForm(tmpDict)
if not SDF.is_valid():
print SDF.errors
else:
SDF.save()

Réponses:

2 pour la réponse № 1

Le problème dans votre code pour moi est que vous ne devez pas écrire

default=datetime.now()

mais plutôt

default = datetime.now

passer la fonction par défaut et non le résultat de la fonction au moment où le code est analysé. Actuellement, toutes vos SignupData auront la même date de signature

Cela dit, je ne suis pas sûr que ce soit la cause de votre bug.


0 pour la réponse № 2

Assurez-vous que vous utilisez réellement Django pour créer vos objets. Sinon, vous contournez toute la magie de Django pour configurer les valeurs par défaut.

Utilisez donc quelque chose comme ceci:

SignupData.objects.create(blah)

Pour utiliser votre dictionnaire, utilisez le déballage du dictionnaire:

SignupData.objects.create(**my_dictionary)

BTW, vous voulez probablement que le paramètre par défaut soit appelable, c'est-à-dire omettez les parens après le now une fonction. De cette façon, la fonction sera appelée chaque fois qu'un nouvel objet est créé. Avec les parens, il ne sera appelé qu'une seule fois et la même valeur sera utilisée pour tous les objets nouvellement créés.