2010-05-22 56 views
1

我有一个Django的'添加业务'视图,它增加了一个新的业务,内嵌'business_contact'表单。测试Django Inline ModelForms:如何安排POST数据?

形式工作正常,但我不知道怎么写了单元测试 - 具体而言,“POSTDATA”发送给self.client.post(settings.BUSINESS_ADD_URL,POSTDATA)

我已经检查我的浏览器中的字段,并尝试添加具有相应名称的发布数据,但运行时仍出现'ManagementForm数据丢失或被篡改'错误。

任何人都知道如何发布内嵌数据的任何资源?

相关型号,如果有帮助,查看&表格。洛塔谢谢。

MODEL:

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) 

浏览次数:

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

形式:

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

回答

2

的问题是你有没有包含在您的数据管理形式。您需要包含form-TOTAL_FORMS(formset中的表单总数,默认值为2),form-INITIAL_FORMS(formset中的初始表单数,默认值为0)和form-MAX_NUM_FORMS(表单集中表单的最大数量,默认值为'' )。

有关管理窗体的更多信息,请参阅Formset documentation

+0

非常感谢约翰 - 工作的一种享受。 – PlankTon 2010-05-22 09:54:11