Ответ 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)

Если это решит вашу проблему, не забудьте принять это как правильный ответ.

Вернуться на верх