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