ValueError не удалось преобразовать строку в float: «

#python #html #django

#python #HTML #django

Вопрос:

У меня есть мое приложение на heroku. Я использую timeme js для записи активного времени пользователя, проведенного на странице, и использую скрытую форму для сохранения значения в базе данных. Кроме того, я использую пакет otree для написания своего приложения. Ниже приведен код, который я использую:

models.py

 class Active(ExtraModel):
    active_duration = models.FloatField()
    active_record = models.LongStringField()
  

views.py/pages.py в отрее

 class intro_instructions(Page):

    def before_next_page(self):
        data = self.form.data
        p = self.player
        active = Active.objects.create(active_duration=data['active_duration'],
                                       active_record=data['active_record'])
        active.save()
  

HTML

 <form method="post" role="form" id="form" autocomplete="off">{% csrf_token %}
    <input type="text" name="active_record" id="id_active_record" style="display: none" >
    <input type="number" step='any' name="active_duration" id="id_active_duration" style="display: none">
</form>

  

Ошибка

 ValueError
could not convert string to float: ''

{
  "csrfmiddlewaretoken": "vVhVRLrAUokmiNGRpzCaP78bnTOQyowf5VMfIDgKGglWGuEyQAU2wooWjQzXuBgD",
  "active_duration": "",
  "active_record": ""
}
  

Это потому, что active_duration пусто? Поможет ли это, если я установлю для форм значение blank= true, null= true?

Я предполагал, что каждое использование будет иметь значение для ввода. Также есть идеи о том, почему входные данные пусты? Может ли быть так, что пользователь использовал скрипты для пропуска страницы без видимых полей? Из сообщения об ошибке sentry это произошло с одним пользователем дважды.

Комментарии:

1. вы устанавливаете значение, "" которое является пустой строкой, вам нужно установить для него значение с плавающей запятой по умолчанию (не уверен, что null будет работать)

2. @Pete, должен ли я установить значение по умолчанию в html или models.py ?

Ответ №1:

Это потому, что вы не можете преобразовать пустую строку в float . Вы можете сделать это вместо этого, хотя:

 active_duration=data.get('active_duration') or "0"
  

Это даст вам значение «0», если data[«active_duration»] пуст, False или None .

 >>> data = {"foo": ""}
>>> data.get("foo") or "bar"
'bar'
  

Комментарии:

1. Привет, не могли бы вы подробнее объяснить разницу между get('active_duration', 0) и get('active_duration') or 0 ? Спасибо

2. Первый установит значение только в том случае, если ключ вообще не существует в dict, поэтому вы все равно получите пустую строку. Последний установит значение в 0, если: * Ключ отсутствует в dict * Значение ключа пустое, отсутствует или равно False