Передача списка строк (uuids) туда и обратно между представлениями django и шаблоном
На одной из страниц моего проекта django у меня есть флажок для выбора uuids, соответствующих модели. Вот что у меня есть на странице views.py, и это хорошо работает для создания флажка.
def template_page(request, uuid_selects=None, option_1=False):
...
class uuidCheckBox(forms.Form):
uuid_selects =
forms.ModelMultipleChoiceField(queryset=uuid_model,
widget=forms.CheckboxSelectMultiple)
uuid_select_field = uuidCheckBox()
args.update({'uuid_select_field': uuid_select_field})
...
render(request, landing.html, args)
На моей странице шаблона есть следующее:
<form action='get_uuid_selects' method='GET'>
{{ uuid_select_field }}
<input type='submit' value='Submit' />
</form>
Который перенаправляет обратно к этому представлению:
def get_uuid_selects(request):
uuid_selects = request.GET.getlist('uuid_selects')
return landing_page(request, uuid_selects)
Все это прекрасно работает, однако когда я пытаюсь передать этот список uuids обратно в шаблон как скрытое значение и вернуть его, когда пользователь обращается к другой форме, список не работает. Например, я передаю список в качестве аргумента, следуя подходу здесь Это views.py
для шаблона:
def template_page(request, uuid_selects=None, option_1=False):
...
if uuid_selects:
args.update({'uuid_selects': json.dumps(uuid_selects)})
...
render(request, landing.html, args)
Затем я передаю этот список uuids обратно на страницу шаблона, чтобы он был скрытым значением в другой форме на template.html
странице.
<form action='to_option_1' method='GET'>
<button type='submit'>Option 1</button>
{% if uuid_selects %}
<input type="hidden" value= {{ uuid_selects }} name="uuid_selects">
{% endif %}
</form>
После того, как я передал список uuids обратно в views.py
, возникает ошибка.def to_option_1(request):
option_1 = True
try:
uuid_selects = request.GET.getlist('uuid_selects')
except KeyError:
uuid_selects = None
return team_landing_page(request,
uuid_selects = uuid_selects,
option_1 = True)
Запрос GET возвращает только первый uuid (список, который я пробовал, был длиннее 1) и в неправильной форме для чтения как uuid (это вызывает ошибку позже в views.py
, но это не имеет значения, из ответа GET ясно, что ошибка возникает именно здесь.:
['“["4322ac69-4c96-4fc1-b901-d68b5nnb0329",”
Ясно, что это как-то связано с форматированием строк, но я не могу понять, как заставить это работать, тем более что передача списка uuids работает в первый раз, когда он просто должен перейти от HTML-шаблона обратно к views.py
- только когда я повторяю процесс, все перестает работать
Извините, если это слишком много кода, просто хотел уточнить, в чем проблема.
Возможно, вам потребуется изменить аргумент вашей функции uuid_selects
на:
def template_page(request, uuid_selects, option_1=False):
Возможно, ошибка заключается в использовании getlist
вместо просто get
?
uuid_selects = request.GET.get('uuid_selects')
Решение (спасибо Benbb96 за предоставление нескольких ключевых советов) заключается в хранении списка uuids в виде строки JSON туда и обратно. На странице template.html
входные данные нужно заключить в одинарные кавычки, чтобы они считывались как строка.
<input type="hidden" value= '{{ uuid_selects }}' name="uuid_selects">
Затем в функции views.py
go_to_option_1
она должна быть считана обратно как строка, не используя функцию getlist
uuid_selects = request.GET('uuid_selects')
Наконец, чтобы прочитать строку обратно как список в python, необходимо разобрать строку JSON.
uuid_selects = json.loads(uuid_selects)