示例#1
0
    def test_factory_for_non_existant_relation(self):

        with self.assertRaises(ValueError):
            inlineformset_factory(Vehicle,
                                  Owner,
                                  fields=ALL_FIELDS,
                                  session=db)
示例#2
0
    def test_factory_with_relation(self):
        info = meta.model_info(Owner)
        formset_class = inlineformset_factory(relation=Owner.vehicles,
                                              fields=ALL_FIELDS,
                                              session=db)

        self.assertEqual(formset_class.fk, info.relationships["vehicles"])
示例#3
0
    def test_inline_form_create_render(self):
        formset_class = inlineformset_factory(relation=Owner.vehicles, fields=("type",), session=db)
        formset = formset_class()

        soup = self.get_soup(formset.as_p())
        expected_soup = self.get_soup(
            "".join(
                [
                    '<input type="hidden" name="vehicles-TOTAL_FORMS" value="3" id="id_vehicles-TOTAL_FORMS" />',
                    '<input type="hidden" name="vehicles-INITIAL_FORMS" value="0" id="id_vehicles-INITIAL_FORMS" />',
                    '<input type="hidden" name="vehicles-MIN_NUM_FORMS" value="0" id="id_vehicles-MIN_NUM_FORMS" />',
                    '<input type="hidden" name="vehicles-MAX_NUM_FORMS" value="1000" id="id_vehicles-MAX_NUM_FORMS" />',
                    "<p>",
                    '  <label for="id_vehicles-0-type">Type:</label>',
                    '  <select id="id_vehicles-0-type" name="vehicles-0-type">',
                    '    <option value="bus">Bus</option>',
                    '    <option value="car">Car</option>',
                    "  </select>",
                    "</p>",
                    "<p>",
                    '  <label for="id_vehicles-0-DELETE">Delete:</label>',
                    '  <input id="id_vehicles-0-DELETE" name="vehicles-0-DELETE" type="checkbox" />',
                    "</p>",
                    "<p>",
                    '  <label for="id_vehicles-1-type">Type:</label>',
                    '  <select id="id_vehicles-1-type" name="vehicles-1-type">',
                    '    <option value="bus">Bus</option>',
                    '    <option value="car">Car</option>',
                    "  </select>",
                    "</p>",
                    "<p>",
                    '  <label for="id_vehicles-1-DELETE">Delete:</label>',
                    '  <input id="id_vehicles-1-DELETE" name="vehicles-1-DELETE" type="checkbox" />',
                    "</p>",
                    "<p>",
                    '  <label for="id_vehicles-2-type">Type:</label>',
                    '  <select id="id_vehicles-2-type" name="vehicles-2-type">',
                    '    <option value="bus">Bus</option>',
                    '    <option value="car">Car</option>',
                    "  </select>",
                    "</p>",
                    "<p>",
                    '  <label for="id_vehicles-2-DELETE">Delete:</label>',
                    '  <input id="id_vehicles-2-DELETE" name="vehicles-2-DELETE" type="checkbox" />',
                    "</p>",
                ]
            )
        )
        self.assertHTMLEqual(soup.prettify(), expected_soup.prettify())
示例#4
0
    def test_inline_form_create(self):
        formset_class = inlineformset_factory(relation=Owner.vehicles, fields=("type",), session=db)
        data = {
            "vehicles-TOTAL_FORMS": "3",
            "vehicles-INITIAL_FORMS": "3",
            "vehicles-MIN_NUM_FORMS": "0",
            "vehicles-MAX_NUM_FORMS": "1000",
            "vehicles-0-type": "car",
            "vehicles-1-type": "bus",
            "vehicles-2-type": "car",
        }
        formset = formset_class(instance=self.owner, data=data)
        values = formset.save()

        self.assertEqual(values[0].owner, self.owner)
        self.assertEqual(values[0].type, VehicleType.car)

        self.assertEqual(values[1].owner, self.owner)
        self.assertEqual(values[1].type, VehicleType.bus)

        self.assertEqual(values[2].owner, self.owner)
        self.assertEqual(values[2].type, VehicleType.car)
示例#5
0
from django.http import HttpResponseRedirect
from django.urls import reverse, reverse_lazy
from django_sorcery.formsets import inlineformset_factory
from django_sorcery.routers import action
from django_sorcery.viewsets import ModelViewSet

from .models import Choice, Question, db

ChoiceFormSet = inlineformset_factory(relation=Question.choices,
                                      fields=(Choice.choice_text.key, ),
                                      session=db)


class PollsViewSet(ModelViewSet):
    model = Question
    fields = (Question.question_text.key, Question.pub_date.key)
    destroy_success_url = reverse_lazy("polls:question-list")

    def get_success_url(self):
        return reverse("polls:question-detail", kwargs={"pk": self.object.pk})

    def get_form_context_data(self, **kwargs):
        kwargs["choice_set"] = self.get_choice_formset()
        return super().get_form_context_data(**kwargs)

    def get_choice_formset(self, instance=None):
        if not hasattr(self, "_choice_formset"):
            instance = instance or self.object
            self._choice_formset = ChoiceFormSet(
                instance=instance,
                data=self.request.POST if self.request.POST else None)
示例#6
0
 def test_initial_form_count(self):
     formset_class = inlineformset_factory(relation=Owner.vehicles,
                                           fields=("type", ),
                                           session=db)
     formset = formset_class(save_as_new=True)
     self.assertEqual(formset.initial_form_count(), 0)
示例#7
0
    def test_factory_with_bad_relation(self):

        with self.assertRaises(ValueError):
            inlineformset_factory(relation=Vehicle.owner,
                                  fields=ALL_FIELDS,
                                  session=db)
示例#8
0
    def test_inline_form_update_render(self):
        self.owner.vehicles = [
            Vehicle(type=VehicleType.car),
            Vehicle(type=VehicleType.bus)
        ]
        db.flush()

        formset_class = inlineformset_factory(relation=Owner.vehicles,
                                              fields=("type", ),
                                              session=db)
        formset = formset_class(instance=self.owner)

        soup = self.get_soup(formset.as_p())
        expected_soup = self.get_soup("".join([
            '<input type="hidden" name="vehicles-TOTAL_FORMS" value="5" id="id_vehicles-TOTAL_FORMS" />',
            '<input type="hidden" name="vehicles-INITIAL_FORMS" value="2" id="id_vehicles-INITIAL_FORMS" />',
            '<input type="hidden" name="vehicles-MIN_NUM_FORMS" value="0" id="id_vehicles-MIN_NUM_FORMS" />',
            '<input type="hidden" name="vehicles-MAX_NUM_FORMS" value="1000" id="id_vehicles-MAX_NUM_FORMS" />',
            "<p>",
            '  <label for="id_vehicles-0-type">Type:</label>',
            '  <select id="id_vehicles-0-type" name="vehicles-0-type">',
            '    <option value="bus">Bus</option>',
            '    <option value="car" selected>Car</option>',
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_vehicles-0-DELETE">Delete:</label>',
            '  <input id="id_vehicles-0-DELETE" name="vehicles-0-DELETE" type="checkbox" />',
            '  <input id="id_vehicles-0-id" name="vehicles-0-id" type="hidden" value="{}" />'
            .format(self.owner.vehicles[0].id),
            "</p>",
            "<p>",
            '  <label for="id_vehicles-1-type">Type:</label>',
            '  <select id="id_vehicles-1-type" name="vehicles-1-type">',
            '    <option value="bus" selected>Bus</option>',
            '    <option value="car">Car</option>',
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_vehicles-1-DELETE">Delete:</label>',
            '  <input id="id_vehicles-1-DELETE" name="vehicles-1-DELETE" type="checkbox" />',
            '  <input id="id_vehicles-1-id" name="vehicles-1-id" type="hidden" value="{}" />'
            .format(self.owner.vehicles[1].id),
            "</p>",
            "<p>",
            '  <label for="id_vehicles-2-type">Type:</label>',
            '  <select id="id_vehicles-2-type" name="vehicles-2-type">',
            '    <option value="bus">Bus</option>',
            '    <option value="car">Car</option>',
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_vehicles-2-DELETE">Delete:</label>',
            '  <input id="id_vehicles-2-DELETE" name="vehicles-2-DELETE" type="checkbox" />',
            "</p>",
            "<p>",
            '  <label for="id_vehicles-3-type">Type:</label>',
            '  <select id="id_vehicles-3-type" name="vehicles-3-type">',
            '    <option value="bus">Bus</option>',
            '    <option value="car">Car</option>',
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_vehicles-3-DELETE">Delete:</label>',
            '  <input id="id_vehicles-3-DELETE" name="vehicles-3-DELETE" type="checkbox" />',
            "</p>",
            "<p>",
            '  <label for="id_vehicles-4-type">Type:</label>',
            '  <select id="id_vehicles-4-type" name="vehicles-4-type">',
            '    <option value="bus">Bus</option>',
            '    <option value="car">Car</option>',
            "  </select>",
            "</p>",
            "<p>",
            '  <label for="id_vehicles-4-DELETE">Delete:</label>',
            '  <input id="id_vehicles-4-DELETE" name="vehicles-4-DELETE" type="checkbox" />',
            "</p>",
        ]))
        self.assertHTMLEqual(soup.prettify(), expected_soup.prettify())