python - 测试 Django 内联模型表单 : How to arrange POST data?

标签 python django testing inline

我有一个 Django“添加业务” View ,它添加了一个带有内联“business_contact”表单的新业务。

表单工作正常,但我想知道如何编写单元测试 - 特别是发送到 self.client.post(settings.BUSINESS_ADD_URL, postdata) 的“postdata”

我检查了浏览器中的字段并尝试添加具有相应名称的发布数据,但在运行时我仍然收到“ManagementForm 数据丢失或已被篡改”错误。

有谁知道有什么资源可以弄清楚如何发布内联数据吗?

如果有帮助,请在下面找到相关模型、 View 和表格。非常感谢。

型号:

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

最佳答案

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

参见 Formset documentation有关管理表格的更多信息。

关于python - 测试 Django 内联模型表单 : How to arrange POST data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2887464/

相关文章:

python - 在 Python 中迭代 OrderedDict

python - 查找 datetime64 的星期几

python - django 中的 python 错误中的订单对象不可迭代

django - 具有外部身份验证的自定义 Django session 管理

testing - 为系统制作自动化测试用例,无需手动从数据库中删除记录即可保存唯一数据

testing - Cucumber 和 JUnit 测试

python - 最大单元格值的 Pandas 列名称

Python解析日期字符串为date

Django 多对多验证

unit-testing - 在单独的文件中运行 Rust 测试