Django Форма для установки значения поля после clean () - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть форма, позволяющая выбрать точку на карте или почтовый индекс. Результатом будет кортеж долготы / широты выбранной точки или центроида области почтового индекса. Я хочу синхронизировать виджет ввода 2 при повторном отображении формы.

Здесь у вас есть решение, которое я нашел благодаря тому, что объяснено в 813418 , но изменение исходных данных формы не рекомендуется, как я могу реализовать такое поведение лучше?

class MyForm(geoforms.Form):

    postalcode = ModelChoiceField(
        queryset=PostalCode.objects.all(),
        required=False,
        initial=2429,
        widget = Select()
    )
    coordinates = geoforms.PointField(
        widget=CustomOSMWidget(),
        required=False,
        srid=4326,
        initial=Point(4.72, 50.63, srid=4326)
    )

    def __init__(self, *args, **kwargs):

        super(MyForm, self).__init__(*args, **kwargs)   
        return

    def clean(self):

        cl_data = super(MyForm, self).clean()

        if not cl_data.get("coordinates"):
            cl_data["coordinates"] = Point(
                float(cl_data["postalcode"].longitude),
                float(cl_data["postalcode"].latitude),
                srid=4326
            )
        else:
            nearest_zipcode = PostalCode.objects.get_nearest_postal_code_centroid(
                longitude=cl_data["coordinates"].x, latitude=cl_data["coordinates"].y)

            cl_data["postalcode"] = nearest_zipcode

        # to synchronize form fields
        # BEWARE changing the raw data of the form is not recomended
        self.data = self.data.copy()  # IMPORTANT, self.data is immutable
        self.data.update(postalcode=cl_data["postalcode"])
        self.data.update(coordinates=cl_data["coordinates"])

        return cl_data
...