Как получить значение формы django внутри этой же формы перед отправкой?
Я создаю форму django с 3 полями выбора. Я хочу, чтобы третье поле выбора (поле объекта) заполнялось на основе первых двух полей выбора. Упрощая, я думаю, что мой вопрос заключается в том, как мне получить значения первых 2 полей выбора, чтобы я мог использовать эти значения в том же самом form.py перед отправкой?
Вот как выглядит мой forms.py, который сейчас выдает ошибку "превышена максимальная глубина рекурсии":
class MyForm(forms.Form):
season = forms.ChoiceField(
widget=forms.Select(attrs={"class": "form-control test"}),
label="season",
choices=SEASON_CHOICES,
)
episode = forms.ChoiceField(
widget=forms.Select(attrs={"class": "form-control"}), label="episode"
)
object = forms.ChoiceField(
widget=forms.Select(attrs={"class": "form-control"}),
label="object",
)
def __init__(self, *args, **kwargs):
super(forms.Form, self).__init__(*args, **kwargs)
form = MyForm()
season = form.cleaned_data.get["season"]
episode = form.cleaned_data.get["episode"]
try:
snow = Snowflake()
snow_data = snow.query(
f"""select * from modern_family"""
)
object_data = snow.query(
f"""select * from {season}.{episode}"""
)
snow.close()
self.fields["episode"].choices = [(sd[0], sd[0]) for sd in snow_data]
self.fields["object"].choices = [(sd[0], sd[0]) for sd in object_data]
except Exception as e:
print(e)
Вы хотите создать "условную" форму, где ранние элементы определяют формат или наличие последующих элементов.
Django не обрабатывает этот случай использования из коробки, поскольку представления, содержащие формы, создаются на стороне сервера и доставляются в браузер клиента. К сожалению, Django не имеет возможности по умолчанию контролировать то, что происходит на клиентской странице. cleaned_data
- это то, что создается отправленной формой, а не той, которая заполняется в данный момент, поэтому ваш подход не будет работать как есть.
Обычно динамические элементы, такие как условные формы, обрабатываются на стороне клиента с помощью javascript, так как элементы на странице могут быть прочитаны перед отправкой с помощью функции onchange() или функции listener, прикрепленной к элементам формы.
Есть несколько подходов, которые можно попробовать
Разделите форму на две, а построенный третий выпадающий список вынесите в отдельное представление и форму - для этого вам понадобится только django
.Используйте HTMX или Ajax, чтобы сделать вызов через javascript обратно на сервер, затем измените третий выпадающий элемент соответствующим образом на основе ответа. HTMX может быть хорошим выбором для этого, поскольку вы можете передать новый HTML выпадающего элемента непосредственно из шаблона django. Это хороший подход, если вам нужно сделать расчеты на стороне сервера о том, какие опции должны быть доступны в третьем выпадающем элементе.
.Использовать javascript для чтения значений первых двух выпадающих элементов и внесения изменений в третий выпадающий элемент. Хороший подход, если вся информация, необходимая для редактирования третьего выпадающего списка, содержится на странице.
.