2010-09-06 6 views
0

J'ai créé un projet avec Django et j'essaie d'écrire des formulaires à db. La classe modèle a deux classes:Django Forms Integrity Error

class Contact(models.Model): 
    name = models.CharField(max_length=200) 
    birth_day = models.DateTimeField() 
    address = models.CharField(max_length=200) 

class PhoneNumber(models.Model): 
    PHONETYPE_CHOICES = (
     (0, 'Home'), 
     (1, 'Work'), 
     (2, 'Fax'), 
     (3, 'Mobile'), 
     (4, 'Other'), 
    ) 
    contact = models.ForeignKey(Contact) 
    phone_type = models.CharField(max_length=255, choices=PHONETYPE_CHOICES) 
    phonenumber = models.CharField(max_length=30) 

Maintenant, si je veux écrire cela avec des formes et je l'utilise seulement:

Nom

Anniversaire

Adresse

Nombre tapez

Numéro de téléphone

comme champs de formulaire.

je reçois:

IntegrityError x_phonenumber.contact_id ne peut pas être NULL

Cela fait partie de la vue:

def main(request): 
    if request.method == 'POST': 
     form = UserForm(request.POST) 
     if form.is_valid(): 
      name = form.cleaned_data['name'], 
      birth_day = form.cleaned_data['birth_day'], 
      address = form.cleaned_data['address'], 
#   contact1= form.cleaned_data['id'] 
      phone_type = form.cleaned_data['phone_type'] 
      phonenumber = form.cleaned_data['phonenumber'] 
      contact = Contact(
       name = form.cleaned_data['name'], 
       birth_day = form.cleaned_data['birth_day'], 
       address = form.cleaned_data['address'], 
      ) 
      contact.save() 
      number = PhoneNumber(
#    contact1 = form.cleaned_data ['id'] 
       phone_type = form.cleaned_data['phone_type'], 
       phonenumber = form.cleaned_data['phonenumber'], 

      ) 
      number.save() 

Je sais que je dois remplir l'ID de la personne ce ForeignKey, mais je pensais que c'est ce que le ForeignKey fera pour moi.

L'objet "contact1" à deux commentaires n'a pas fonctionné. Mais c'est essentiellement ce que je veux, ajouter l'id à cela. De plus, Django ajoute toujours une clé primaire _id à chaque table (contact et Phonenumber).

Donc, je n'ai pas compris pourquoi, Django n'a pas ajouté à cela.

Comment puis-je enregistrer ce db avec le code correct, clé primaire, etc ..

Merci

Répondre

2

Le ForeignKey ne peut pas savoir quelle personne par magie, il est censé être pointant, à moins que vous le dites.

Dans votre cas, une fois que vous avez terminé contact.save(), vous avez comme une instance Contact, vous pouvez donc l'utiliser.

number = PhoneNumber(
    contact = contact, 
    phone_type = form.cleaned_data['phone_type'], 
    phonenumber = form.cleaned_data['phonenumber'], 
) 
number.save() 
0

Comment Django pourrait connaître des lignes de Wich devrait-il chaîne? Vous devez passer l'instance de contact en tant qu'argument pour le champ de clé étrangère.

contact = Contact(...) 
contact.save() 
number = PhoneNumber(...) 
number.contact = contact # here comes the instance of Contact model 
number.save() 
1

Tenir compte de ces deux lignes:

number = PhoneNumber(
    # contact1 = form.cleaned_data ['id'] 
    phone_type = form.cleaned_data['phone_type'], 
    phonenumber = form.cleaned_data['phonenumber'], 
) 

number.save() 

Vous créez une instance de PhoneNumber et l'enregistrer. Toutefois, une instance de PhoneNumber est requise pour avoir une clé étrangère valide dans une instance de Contact. Ce n'est pas réglé avant vous save() le PhoneNumber et par conséquent vous obtenez l'erreur.

Pour résoudre ce problème, pointez le champ contact de l'instance PhoneNumber sur le Contact que vous avez enregistré avant d'enregistrer le numéro de téléphone. Quelque chose comme ceci:

number = PhoneNumber(
    # contact1 = form.cleaned_data ['id'] 
    phone_type = form.cleaned_data['phone_type'], 
    phonenumber = form.cleaned_data['phonenumber'], 
) 

number.contact = contact # <===== Attach the contact. 
number.save()