Ответ Django - если POST = None, оставьте пустую пару ключ-значение из jsonresponse
нижеприведенная форма + просмотр работает нормально
forms.py
class FormGlobalSettings(forms.Form):
global_font_family = forms.TypedChoiceField(required=False, label='Font Family', choices=choices_font_family, empty_value=None)
views.py
def main_view(request):
if request.method != 'POST':
form_global_settings = FormGlobalSettings()
else:
form_global_settings = FormGlobalSettings(data=request.POST)
if all([form_global_settings.is_valid()]):
cleaned_data = form_global_settings.cleaned_data
nested_data = {"fontFamily": cleaned_data3['global_font_family']}
return JsonResponse(nested_data)
return render(request, 'pbi_theme_app/index.html', {'form_global_settings': form_global_settings})
Выход:
{"fontFamily": "Arial"}
Однако, я пытаюсь добиться того, чтобы иногда POST запрос был пустым/пусто/null, так как пользователь не хочет иметь никакого значения в этом поле. Варианты для global_font_family установлены таким образом:
choices_font_family = [(None, ""), ("Arial", "Arial"), etc..]
Имеется в виду, что если пользователь оставляет поле пустым, то получается None. Это приводит к тому, что в json оно будет иметь значение null:
{"fontFamily": null}
Теперь то, чего я пытаюсь достичь, и поскольку я жестко закодировал "fontFamily" в jsonresponse, я хочу, чтобы вся пара ключ-значение исчезла, если пользователь решит, что поле пустое, то есть чтобы вся пара ключ-значение "fontFamily: null" исчезла из jsonresponse.
Подведем итоги: Мне нужно как-то сделать ключ в json динамическим, и когда POST запрос пуст, я хочу оставить всю пару ключ-значение от ввода в json.
Задуманное поведение можно увидеть на следующей странице, когда вы загружаете тему и ничего не ввели, она оставляет весь json код пустым:
https://powerbi.tips/tools/report-theme-generator-v3/
Спасибо :)
Прежде всего, вам не нужно включать none
в список выбора. Вы можете просто объявить null=True
в полях вашего model.py
класса.
Вы можете добиться желаемого поведения, перезаписав нужное поле в своем классе model.py
перед сохранением ввода
Предположим, что у меня есть следующий класс.
choices_font_family = [
("c1", "choice1"),
("c2", "choice2"),
("c3", "choice3"),
("c4", "choice4")
]
class Post(models.Model):
theme_type = models.CharField(null=True, max_length=255, verbose_name="some text", choices=choices_font_family )
....
....
def save(self, force_insert=False, force_update=False, *args, **kwargs):
if theme_type is None:
theme_type = '<some font>' # overwriting none to whatever you want it to be
super().save(force_insert, force_update, *args, **kwargs)
Если это решит вашу проблему, не забудьте принять это как правильный ответ.