2013-08-22 6 views
3

J'ai une forme, travailler hors modèles différents et en utilisant un modèle par (intermédiaire):Django: Formulaire méthode save

class CourseBooking(BaseModel): 
    '''Intermediary model linking a person on a course with the related booking''' 

    course = ForeignKey('ScheduledCourse') 
    customer = ForeignKey('Customer') 
    booking = ForeignKey('GroupBooking', blank=True, null=True) 

Le formulaire utilise une forme de base au lieu de formulaire modèle, avec les champs ajoutés dans manuellement:

class CourseBookingForm(Form): 

    course = ModelChoiceField(queryset=ScheduledCourse.objects.all())  
    title = CharField(
      max_length=255, 
      widget=Select(choices=TITLE_CHOICES), 
      required=False 
      ) 
    gender = CharField(
      max_length=255, 
      widget=Select(choices=GENDER_CHOICES), 
      required=False 
      ) 
    first_name = CharField(max_length=255) 
    surname = CharField(max_length=255) 
    dob = DateField(required=False)  
    medical = CharField(required=False, widget = forms.Textarea(attrs={'rows': '4'})) 
    # miscellaneous notes 
    notes = CharField(required=False, widget = forms.Textarea(attrs={'rows': '4'})) 
    email = EmailField(required=False) 
    phone = CharField(required=False) 
    address = CharField(
      max_length=8188, 
      widget=Textarea(attrs={'rows':'4', 'cols':'50'}), 
      required=False) 
    city = CharField(max_length=255, required=False) 
    county = CharField(
      max_length=255, widget=Select(choices=COUNTY_CHOICES)) 
    postcode = CharField(max_length=255, required=False) 
    country = CharField(
      max_length=255, 
      widget=Select(choices=COUNTRIES), required=False) 

Je veux créer une méthode de sauvegarde dans le forms.py qui sauvera la base de données. Ce que j'ai en ce moment (ce qui est faux) est et donne l'erreur: IntegrityError: null value in column "customer_id" violates not-null constraint

def save(self): 

    data = self.cleaned_data 

    if self.cleaned_data['course']: 
     crs = self.cleaned_data['course'] 
     course_booking = CourseBooking(course=crs) 
    course_booking.save() 

    course = CourseBooking.objects.create(course=data['course']) 
    course.save() 

    cust = Customer.objects.create(title=data['title'], 
            gender=data['gender'], 
            first_name=data['first_name'], 
            surname=data['surname'], 
            dob=data['dob'], 
            notes=data['notes'], 
            medical=data['medical'], 
            content_object=cust, 
            ) 
    cust.save() 

    address = Address.objects.create(address=data['address'], 
         city=data['city'], 
         county=data['county'], 
         postcode =data['postcode'], 
         country=data['country'], 
         content_object=address, 
        ) 
    address.save() 

    email = Email.objects.create(email=data['email'], 
           content_object=email) 
    email.save() 

    phone = Phone.objects.create(number=data['phone'], 
        content_object=phone) 
    phone.save() 

Répondre

6

Il suffit d'appeler le code pour la création de l'objet courseaprès création de l'objet customer.

Le problème est que le modèle ForeignKeycustomer du modèle Course est requis et que vous n'avez pas défini ce champ lors de la création de l'objet.

Vous avez quelques autres problèmes mineurs que j'ai corrigés dans le code. .

def save(self): 
    data = self.cleaned_data 

    course_booking = None 
    if self.cleaned_data['course']: 
     crs = self.cleaned_data['course'] 
     course_booking = CourseBooking(course=crs) 
     course_booking.save() 

    cust = Customer.objects.create(title=data['title'], 
            gender=data['gender'], 
            first_name=data['first_name'], 
            surname=data['surname'], 
            dob=data['dob'], 
            notes=data['notes'], 
            medical=data['medical'], 
            content_object=cust, 
            ) 
    #cust.save() 

    course = CourseBooking.objects.create(course=data['course'], customer = cust) 
    if course_booking: 
     course.booking = course_booking 

    #course.save() 

    address = Address.objects.create(address=data['address'], 
         city=data['city'], 
         county=data['county'], 
         postcode =data['postcode'], 
         country=data['country'], 
         content_object=address, 
        ) 
    #address.save() 

    email = Email.objects.create(email=data['email'], 
           content_object=email) 
    #email.save() 

    phone = Phone.objects.create(number=data['phone'], 
        content_object=phone) 
    #phone.save() 

Sur une autre note, je mettrais cette logique de création d'objets dans la vue, plutôt que la méthode save du model_form.

+1

Notez que save() prend un argument 'commit' optionnel; vous devriez le gérer. –

Questions connexes