Динамически созданные поля формы Django отсутствуют в очищенных_данныхPython

Программы на Python
Anonymous
Динамически созданные поля формы Django отсутствуют в очищенных_данных

Сообщение Anonymous »

Я пытаюсь реализовать динамические поля в ModelForm с помощью запросов AJAX.
У меня есть настраиваемое поле camera_num как IntegerField. Как только пользователь выбирает значение, AJAX передает значение поля camera_num в ModelForm с помощью kwargs и генерирует form.ModelChoiceField с именами camera_{number ("camera_1", "camera_2" .. . "camera_3").
Однако при отправке формы form.data содержит все "камеры" (скажем, {"camera_1": [1], "camera_2": [2]) ), тогда как form.cleaned_data содержит только одну камеру ("camera_1").
class ConfigurationForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
cameras_qty = kwargs.pop('cameras_qty', 1)
super(ConfigurationForm, self).__init__(*args, **kwargs)

if cameras_qty:
for camera_num in range(1, cameras_qty+1):
self.fields[f"camera_{camera_num}"] = forms.ModelChoiceField(
label=f"Camera {camera_num}",
queryset=models.Camera.objects.all()
)

cameras_num = forms.IntegerField(
widget=forms.Select(choices=[(i,i) for i in range(1, 4)]),
initial=1
)

view.py:
def create_device_view(request):
if request.method == "POST":
device_config_form = forms.ConfigurationForm(request.POST)
# here device_config_form.data contains all "cameras"
if device_config_form.is_valid():
# here only "camera_1" exists in device_config_form.cleaned_data
device_config_form.save()
return redirect(reverse("device_list", kwargs={"status": "all"}))
else:
device_config_form = forms.ConfigurationForm()
if is_ajax(request):
# cameras
cameras_qty = request.GET.get("cameras_qty")
if cameras_qty and isinstance(cameras_qty, str):
cameras_data = []
# passing cameras qty received from GET parameters
device_config_form = forms.ConfigurationForm(cameras_qty=int(cameras_qty))
for field_name in device_config_form.fields.keys():
if field_name.startswith("camera_"):
camera_field = (
device_config_form[field_name].label_tag(),
str(device_config_form[field_name])
)
cameras_data.append(camera_field)
return JsonResponse(
data={"success": True, "cameras": cameras_data},
safe=False
)

return render(
request,
"production/device_create.html",
{"device_config_form": device_config_form})


Подробнее здесь: https://stackoverflow.com/questions/789 ... eaned-data

Вернуться в «Python»