2010-05-22 6 views
1

J'ai une vue Django 'ajouter une entreprise' qui ajoute une nouvelle entreprise avec un formulaire 'business_contact' en ligne.Test de Django Inline ModelForms: comment organiser les données POST?

La forme fonctionne très bien, mais je me demande comment écrire le test unitaire - en particulier, le « postdata » à envoyer à self.client.post (settings.BUSINESS_ADD_URL, postdata)

J'ai J'ai inspecté les champs dans mon navigateur et essayé d'ajouter des données de publication avec les noms correspondants, mais je reçois toujours une erreur 'ManagementForm data is missing or a été altérée' lors de l'exécution.

Quelqu'un connaît des ressources pour savoir comment publier des données en ligne?

Les modèles concernés, les vues & formes ci-dessous si elle aide. Lotsa merci.

Modèle:

class Contact(models.Model): 
    """ Contact details for the representatives of each business """ 
    first_name = models.CharField(max_length=200) 
    surname = models.CharField(max_length=200) 
    business = models.ForeignKey('Business') 
    slug = models.SlugField(max_length=150, unique=True, help_text=settings.SLUG_HELPER_TEXT) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    phone = models.CharField(max_length=100, null=True, blank=True) 
    mobile_phone = models.CharField(max_length=100, null=True, blank=True) 
    email = models.EmailField(null=True) 
    deleted = models.BooleanField(default=False) 
    class Meta: 
     db_table='business_contact' 

    def __unicode__(self): 
     return '%s %s' % (self.first_name, self.surname) 

    @models.permalink 
    def get_absolute_url(self): 
     return('business_contact',(), {'contact_slug': self.slug }) 

class Business(models.Model): 
    """ The business clients who you are selling products/services to """ 
    business = models.CharField(max_length=255, unique=True) 
    slug = models.SlugField(max_length=100, unique=True, help_text=settings.SLUG_HELPER_TEXT) 
    description = models.TextField(null=True, blank=True) 
    primary_contact = models.ForeignKey('Contact', null=True, blank=True, related_name='primary_contact') 
    business_type = models.ForeignKey('BusinessType') 
    deleted = models.BooleanField(default=False) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    address_1 = models.CharField(max_length=255, null=True, blank=True) 
    address_2 = models.CharField(max_length=255, null=True, blank=True) 
    suburb = models.CharField(max_length=255, null=True, blank=True) 
    city = models.CharField(max_length=255, null=True, blank=True) 
    state = models.CharField(max_length=255, null=True, blank=True) 
    country = models.CharField(max_length=255, null=True, blank=True) 
    phone = models.CharField(max_length=40, null=True, blank=True) 
    website = models.URLField(null=True, blank=True) 
    class Meta: 
     db_table = 'business' 

    def __unicode__(self): 
     return self.business 

    def get_absolute_url(self): 
     return '%s%s/' % (settings.BUSINESS_URL, self.slug) 

VUES:

def business_add(request): 
    template_name = 'business/business_add.html' 
    if request.method == 'POST': 
     form = AddBusinessForm(request.POST) 
     if form.is_valid(): 
      business = form.save(commit=False) 
      contact_formset = AddBusinessFormSet(request.POST, instance=business) 
      if contact_formset.is_valid(): 
       business.save() 
       contact_formset.save() 
       contact = Contact.objects.get(id=business.id) 
       business.primary_contact = contact 
       business.save() 
       #return HttpResponse(help(contact)) 
       #business.primary = contact.id 
       return HttpResponseRedirect(settings.BUSINESS_URL) 
     else: 
      contact_formset = AddBusinessFormSet(request.POST) 
    else: 
     form = AddBusinessForm() 
     contact_formset = AddBusinessFormSet(instance=Business()) 
    return render_to_response(
      template_name, 
      { 
      'form': form, 
      'contact_formset': contact_formset, 
      }, 
      context_instance=RequestContext(request) 
      ) 

FORMES:

class AddBusinessForm(ModelForm): 
    class Meta: 
     model = Business 
     exclude = ['deleted','primary_contact',] 

class ContactForm(ModelForm): 
    class Meta: 
     model = Contact 
     exclude = ['deleted',] 


AddBusinessFormSet = inlineformset_factory(Business, 
     Contact, 
     can_delete=False, 
     extra=1, 
     form=AddBusinessForm, 
     ) 

Répondre

2

Le problème est que vous n'avez pas inclus le formulaire de gestion dans vos données. Vous devez inclure form-TOTAL_FORMS (le nombre total de formulaires dans le formset, par défaut est 2), form-INITIAL_FORMS (le nombre initial de formulaires dans le formset, par défaut est 0) et form-MAX_NUM_FORMS (le nombre maximal de formulaires dans le formset, par défaut est ''). Pour plus d'informations sur le formulaire de gestion, consultez le Formset documentation.

+0

Un grand merci John - a travaillé un régal. – PlankTon

Questions connexes