これらのDjangoSuperFormsの更新バージョンを探しています。Django1.2で動作させることができないようです。特に、ModelFormsで動作するようにしたいと思います。
私のユースケースは彼とほとんど同じです。Address
いろいろなところにサブフォームとして使いたいモデルがあります。ビュー機能ですべてを組み合わせようとするのは面倒です。
これらのDjangoSuperFormsの更新バージョンを探しています。Django1.2で動作させることができないようです。特に、ModelFormsで動作するようにしたいと思います。
私のユースケースは彼とほとんど同じです。Address
いろいろなところにサブフォームとして使いたいモデルがあります。ビュー機能ですべてを組み合わせようとするのは面倒です。
superforms.pyを1.2で動作するように更新し、リンク先のチケットに添付しました:http: //code.djangoproject.com/attachment/ticket/3706/superform.2.py
私が取り組んでいるプロジェクトがあり、これから恩恵を受けることができるので、私は時間をかけてあなたも助けると思いました。
私はこれを1.2で動作させたばかりで、内部をクリーンアップしようとはしなかったことを覚えておいてください。APIを証明するテストケースができたので、後で戻ってクリーンアップできます。
ModelFormsで使用していて、save()機能が必要な場合は、SuperFormクラスのメソッドをオーバーライドする必要があります。
私は現在、複数のサブフォーム、混合サブフォームと宣言されたフォーム、およびModelFormsをカバーする約90%のコードカバレッジを持つ「共通」リポジトリにローカルにあります。以下にテストケースを含めました(私のTestCaseBase
クラスを使用していることに注意してください。ただし、これでAPIの要点がわかります)。ご不明な点がございましたら、お気軽にお問い合わせください。
from django_common.forms.superform import SuperForm, SubForm
from django_common.test import TestCaseBase
from django import forms
class WhenSuperFormsIsUsedWithOnlySubForms(TestCaseBase):
def get_superform_with_forms(self, post_data=None):
class AddressForm(forms.Form):
street = forms.CharField(max_length=255)
city = forms.CharField(max_length=255)
class BusinessLocationForm(forms.Form):
phone_num = forms.CharField(max_length=255)
class TestSuperForm(SuperForm):
address = SubForm(AddressForm)
business_location = SubForm(BusinessLocationForm)
return TestSuperForm(data=post_data)
def should_not_be_valid_with_no_data(self):
tsf = self.get_superform_with_forms()
self.assert_false(tsf.is_valid())
def should_have_two_sub_forms(self):
tsf = self.get_superform_with_forms()
self.assert_equal(len(tsf.base_subforms), 2)
self.assert_equal(len(tsf.forms), 2)
def should_display_as_ul(self):
tsf = self.get_superform_with_forms()
self.assert_equal(tsf.as_ul(), '<li><label for="id_business_location-phone_num">Phone num:</label> <input id="id_business_location-phone_num" type="text" name="business_location-phone_num" maxlength="255" /></li>\n<li><label for="id_address-street">Street:</label> <input id="id_address-street" type="text" name="address-street" maxlength="255" /></li>\n<li><label for="id_address-city">City:</label> <input id="id_address-city" type="text" name="address-city" maxlength="255" /></li>')
def should_display_as_table(self):
tsf = self.get_superform_with_forms()
self.assert_equal(tsf.as_table(), '<tr><th><label for="id_business_location-phone_num">Phone num:</label></th><td><input id="id_business_location-phone_num" type="text" name="business_location-phone_num" maxlength="255" /></td></tr>\n<tr><th><label for="id_address-street">Street:</label></th><td><input id="id_address-street" type="text" name="address-street" maxlength="255" /></td></tr>\n<tr><th><label for="id_address-city">City:</label></th><td><input id="id_address-city" type="text" name="address-city" maxlength="255" /></td></tr>')
def should_display_as_p(self):
tsf = self.get_superform_with_forms()
self.assert_equal(tsf.as_p(), '<p><label for="id_business_location-phone_num">Phone num:</label> <input id="id_business_location-phone_num" type="text" name="business_location-phone_num" maxlength="255" /></p>\n<p><label for="id_address-street">Street:</label> <input id="id_address-street" type="text" name="address-street" maxlength="255" /></p>\n<p><label for="id_address-city">City:</label> <input id="id_address-city" type="text" name="address-city" maxlength="255" /></p>')
def should_display_as_table_with_unicode(self):
tsf = self.get_superform_with_forms()
self.assert_equal(tsf.__unicode__(), tsf.as_table())
def should_be_valid_if_good_data(self):
data = {
'business_location-phone_num' : '8055551234',
'address-street' : '1234 Street Dr.',
'address-city' : 'Santa Barbara',
}
tsf = self.get_superform_with_forms(data)
self.assert_true(tsf.is_valid())
self.assert_equal(tsf.cleaned_data['business_location']['phone_num'],
'8055551234')
self.assert_equal(tsf.cleaned_data['address']['street'], '1234 Street Dr.')
self.assert_equal(tsf.cleaned_data['address']['city'], 'Santa Barbara')
def should_be_invalid_if_missing_data(self):
data = {
'business_location-phone_num' : '8055551234',
'address-street' : '1234 Street Dr.',
}
tsf = self.get_superform_with_forms(data)
self.assert_false(tsf.is_valid())
self.assert_false(tsf.errors['business_location'])
self.assert_true(tsf.errors['address'])
self.assert_equal(tsf.errors['address']['city'], ['This field is required.'])
def should_be_invalid_if_invalid_data(self):
data = {
'business_location-phone_num' : '8055551234',
'address-street' : '1234 Street Dr.',
'address-city' : '',
}
tsf = self.get_superform_with_forms(data)
self.assert_false(tsf.is_valid())
class WhenSuperformsIsUsedWithSubFormsAndDeclaredFields(TestCaseBase):
"""Some basic sanity checks that working with fields combined with SubForms works."""
def get_superform_with_forms(self, post_data=None):
class AddressForm(forms.Form):
street = forms.CharField(max_length=255)
class TestSuperForm(SuperForm):
name = forms.CharField(max_length=255)
address = SubForm(AddressForm)
return TestSuperForm(data=post_data)
def should_not_be_valid_with_no_data(self):
tsf = self.get_superform_with_forms()
self.assert_false(tsf.is_valid())
def should_have_two_forms_and_a_single_subform(self):
tsf = self.get_superform_with_forms()
self.assert_equal(len(tsf.base_subforms), 1)
self.assert_equal(len(tsf.forms), 2)
def should_print_as_table(self):
tsf = self.get_superform_with_forms()
self.assert_equal(tsf.as_table(), '<tr><th><label for="id_name">Name:</label></th><td><input id="id_name" type="text" name="name" maxlength="255" /></td></tr>\n<tr><th><label for="id_address-street">Street:</label></th><td><input id="id_address-street" type="text" name="address-street" maxlength="255" /></td></tr>')
def should_validate_when_fields_exist(self):
data = {
'name': 'Sam',
'address-street': 'Some Street',
}
tsf = self.get_superform_with_forms(data)
self.assert_true(tsf.is_valid())
self.assert_equal(tsf.cleaned_data['name'], 'Sam')
self.assert_equal(tsf.cleaned_data['address']['street'], 'Some Street')
def should_not_validate_with_invalid_data(self):
data = {
'name': '',
'address-street': 'Some Street',
}
tsf = self.get_superform_with_forms(data)
self.assert_false(tsf.is_valid())
self.assert_equal(tsf.errors['name'], ['This field is required.'])
class WhenSuperformsIsUsedWithModelForms(TestCaseBase):
def get_superform_with_forms(self, post_data=None):
from django.db import models
class Address(models.Model):
city = models.CharField(max_length=255)
class AddressForm(forms.ModelForm):
class Meta:
model = Address
class TestSuperForm(SuperForm):
address = SubForm(AddressForm)
return TestSuperForm(data=post_data)
def should_not_be_valid_with_no_data(self):
tsf = self.get_superform_with_forms()
self.assert_false(tsf.is_valid())
def should_have_two_forms_and_a_single_subform(self):
tsf = self.get_superform_with_forms()
self.assert_equal(len(tsf.base_subforms), 1)
self.assert_equal(len(tsf.forms), 1)
def should_print_as_table(self):
tsf = self.get_superform_with_forms()
self.assert_equal(tsf.as_table(), '<tr><th><label for="id_address-city">City:</label></th><td><input id="id_address-city" type="text" name="address-city" maxlength="255" /></td></tr>')
def should_validate_when_fields_exist(self):
data = {
'address-city': 'Some City',
}
tsf = self.get_superform_with_forms(data)
self.assert_true(tsf.is_valid())
self.assert_equal(tsf.cleaned_data['address']['city'], 'Some City')
def should_not_validate_with_invalid_data(self):
data = {
'address-city': '',
}
tsf = self.get_superform_with_forms(data)
self.assert_false(tsf.is_valid())
self.assert_equal(tsf.errors['address']['city'], ['This field is required.'])
楽しみ!