def test_fields_bad_value(self): with self.assertRaises(TypeError) as ctx: forms.modelform_factory(Owner, forms.ModelForm, fields="abc1234") self.assertEqual(ctx.exception.args, ( "OwnerForm.Meta.fields cannot be a string. Did you mean to type: ('abc1234',)?", ))
def test_modelform_factory_with_no_fields_exclude(self): with self.assertRaises(ImproperlyConfigured) as ctx: forms.modelform_factory(Owner, session=db) self.assertEqual( ctx.exception.args, ("Calling modelform_factory without defining 'fields' or 'exclude' explicitly is prohibited.", ), )
def test_modelform_factory_with_formfield_callback(self): self.callback_called = False def callback(*args, **kwargs): self.callback_called = True forms.modelform_factory(Owner, fields=forms.ALL_FIELDS, formfield_callback=callback, session=db) self.assertTrue(self.callback_called)
def test_modelform_factory_fields(self): form_class = modelform_factory(Vehicle, fields=ALL_FIELDS, session=db) form = form_class() self.assertListEqual(sorted(form.fields.keys()), [ "created_at", "is_used", "name", "options", "owner", "paint", "parts", "type" ])
def test_create_invalid(self): form_cls = forms.modelform_factory(Owner, fields=("first_name", "last_name"), session=db) form_cls.base_fields["first_name"].required = True form_cls.base_fields["last_name"].required = True class OwnerViewSet(viewsets.CreateModelMixin, viewsets.GenericViewSet): model = Owner form_class = form_cls success_url = "/viewsets/owners/{id}/" viewset = OwnerViewSet() viewset.kwargs = {} viewset.request = self.factory.post("/", data={}) viewset.action = "create" response = viewset.create(viewset.request) self.assertEqual(response.status_code, 200) self.assertEqual( response.context_data["form"].errors, { "first_name": ["This field is required."], "last_name": ["This field is required."] }, )
def test_modelform_factory_modelchoicefield_choices(self): form_class = modelform_factory(Vehicle, fields=ALL_FIELDS, session=db) data = {"name": "testing", "type": "car", "owner": 1} form = form_class(data=data) owner_choices = form.fields["owner"].choices option_choices = form.fields["options"].choices self.assertEqual(len(owner_choices), 2) self.assertEqual(len(option_choices), 4)
def test_get_bound_field(self): db.rollback() form = modelform_factory(Vehicle, fields=("owner", ), session=db)() field = form.fields["owner"] bf = field.get_bound_field(form, "owner") self.assertHTMLEqual( str(bf), '<select name="owner" required id="id_owner"><option value="" selected>---------</option></select>' )
def test_modelform_factory_instance_validate(self): vehicle = Vehicle(owner=self.owner) form_class = modelform_factory(Vehicle, fields=ALL_FIELDS, session=db) form = form_class(instance=vehicle, data={"name": "testing"}) self.assertFalse(form.is_valid()) self.assertEqual( { "type": ["This field is required."], "owner": ["This field is required."] }, form.errors)
def test_modelform_factory_instance_save(self): form_class = forms.modelform_factory(Vehicle, fields=forms.ALL_FIELDS, session=db) data = { "name": "testing", "type": "car", "owner": self.owner.id, "is_used": True } form = form_class(data=data) self.assertTrue(form.is_valid(), form.errors) form.save()
def test_new_with_form_class(self): form_cls = forms.modelform_factory(Owner, fields="__all__", session=db) class OwnerViewSet(viewsets.CreateModelMixin, viewsets.GenericViewSet): model = Owner form_class = form_cls viewset = OwnerViewSet() viewset.kwargs = {} viewset.request = self.factory.get("/") viewset.action = "new" response = viewset.new(viewset.request) self.assertEqual(response.status_code, 200) self.assertDictEqual(response.context_data, { "form": response.context_data["form"], "view": viewset }) self.assertIsInstance(response.context_data["form"], form_cls)
def test_modelform_factory_instance_render(self): form_class = forms.modelform_factory(Vehicle, fields=forms.ALL_FIELDS, session=db) vehicle = Vehicle(owner=self.owner, type=VehicleType.car) form = form_class(instance=vehicle, data={}) self.assertTrue(form.is_bound) self.assertEqual( form.errors, { "type": ["This field is required."], "is_used": ["This field is required."] }) self.assertEqual( form.initial, { "created_at": None, "is_used": False, "msrp": None, "name": None, "owner": self.owner.id, "paint": None, "type": VehicleType.car, }, ) self.assertEqual( form.cleaned_data, { "paint": "", "msrp": None, "created_at": None, "options": [], "parts": [], "name": "", "owner": None }, ) form.order_fields(sorted(form.fields.keys())) soup = self.get_soup(form.as_p()) expected_soup = self.get_soup("".join([ "<p>", ' <label for="id_created_at">Created at:</label>', ' <input type="text" name="created_at" id="id_created_at" />', "</p>", '<ul class="errorlist"><li>This field is required.</li></ul>', "<p>", ' <label for="id_is_used">Is used:</label>', ' <input id="id_is_used" name="is_used" required type="checkbox" />', "</p>", "<p>", ' <label for="id_msrp">Msrp:</label>', ' <input id="id_msrp" name="msrp" step="0.01" type="number" />', "</p>", "<p>", ' <label for="id_name">Name:</label>', ' <input id="id_name" maxlength="50" name="name" type="text" />', ' <span class="helptext">' " The name of the vehicle", " </span>", "</p>", "<p>", ' <label for="id_options">Options:</label>', ' <select id="id_options" multiple="multiple" name="options">', " <option value=\"1\">Option(id=1, name='Option 1')</option>", " <option value=\"2\">Option(id=2, name='Option 2')</option>", " <option value=\"3\">Option(id=3, name='Option 3')</option>", " <option value=\"4\">Option(id=4, name='Option 4')</option>", " </select>", "</p>", "<p>", ' <label for="id_owner">Owner:</label>', ' <select id="id_owner" name="owner">', " <option selected value>---------</option>", ' <option value="{}">{}</option>'.format( self.owner.id, self.owner), " </select>", "</p>", "<p>", ' <label for="id_paint">Paint:</label>', ' <select id="id_paint" name="paint">', " <option selected value></option>", ' <option value="red">red</option>', ' <option value="green">green</option>', ' <option value="blue">blue</option>', ' <option value="silver">silver</option>', ' <option value="pink">pink</option>', " </select>", "</p>", "<p>", ' <label for="id_parts">Parts:</label>', ' <select id="id_parts" multiple="multiple" name="parts">', " </select>", "</p>", '<ul class="errorlist">', " <li>", " This field is required.", " </li>", "</ul>", "<p>", ' <label for="id_type">Type:</label>', ' <select id="id_type" name="type">', ' <option value="bus">Bus</option>', ' <option value="car">Car</option>', " </select>", "</p>", ])) self.assertHTMLEqual(soup.prettify(), expected_soup.prettify())
class OwnerViewSet(viewsets.CreateModelMixin, viewsets.GenericViewSet): model = Owner fields = "__all__" form_class = forms.modelform_factory(Owner, fields="__all__", session=db)
def test_modelform_factory_new_render(self): form_class = modelform_factory(Vehicle, fields=ALL_FIELDS, session=db) form = form_class(data={}) self.assertTrue(form.is_bound) self.assertEqual( form.errors, { "owner": ["This field is required."], "type": ["This field is required."] }) self.assertEqual( form.initial, { "paint": None, "created_at": None, "type": None, "name": None, "is_used": None }) self.assertEqual( form.cleaned_data, { "paint": "", "created_at": None, "options": [], "parts": [], "name": "", "is_used": None }, ) form.order_fields(sorted(form.fields.keys())) soup = self.get_soup(form.as_p()) expected_soup = self.get_soup("".join([ "<p>", ' <label for="id_created_at">Created at:</label>', ' <input type="text" name="created_at" id="id_created_at" />' "</p>", "<p>", ' <label for="id_is_used">Is used:</label>', ' <select name="is_used" id="id_is_used">', ' <option value="1" selected>Unknown</option>', ' <option value="2">Yes</option>', ' <option value="3">No</option>', " </select>", "</p>", "<p>", ' <label for="id_name">Name:</label>', ' <input id="id_name" name="name" type="text" />', ' <span class="helptext">' " The name of the vehicle", " </span>", "</p>", "<p>", ' <label for="id_options">Options:</label>', ' <select id="id_options" multiple="multiple" name="options">', " <option value=\"1\">Option(id=1, name='Option 1')</option>", " <option value=\"2\">Option(id=2, name='Option 2')</option>", " <option value=\"3\">Option(id=3, name='Option 3')</option>", " <option value=\"4\">Option(id=4, name='Option 4')</option>", " </select>", "</p>", '<ul class="errorlist">', " <li>", " This field is required.", " </li>", "</ul>", "<p>", ' <label for="id_owner">Owner:</label>', ' <select id="id_owner" name="owner" required>', " <option selected value>---------</option>", ' <option value="{}">{}</option>'.format( self.owner.id, self.owner), " </select>", "</p>", "<p>", ' <label for="id_paint">Paint:</label>', ' <select id="id_paint" name="paint">', " <option selected value></option>", ' <option value="red">red</option>', ' <option value="green">green</option>', ' <option value="blue">blue</option>', ' <option value="silver">silver</option>', ' <option value="pink">pink</option>', " </select>", "</p>", "<p>", ' <label for="id_parts">Parts:</label>', ' <select id="id_parts" multiple="multiple" name="parts">', " </select>", "</p>", '<ul class="errorlist">', " <li>", " This field is required.", " </li>", "</ul>", "<p>", ' <label for="id_type">Type:</label>', ' <select id="id_type" name="type">', ' <option value="bus">Bus</option>', ' <option value="car">Car</option>', " </select>", "</p>", ])) self.assertEqual(soup.prettify(), expected_soup.prettify())
class OwnerCreateViewWithForm(views.CreateView): model = Owner session = db form_class = forms.modelform_factory(Owner, fields="__all__", session=db)