Почему FloatField не принимает вводимое значение? - PullRequest
0 голосов
/ 21 января 2020

Я создал веб-приложение с Django. Хотя FloatField был обозначен как поля модели 'weight' и 'height', мое приложение отказалось вводить значение float и принимает только целые числа. Я пытаюсь объявить FloatField в формах, но, похоже, это не работает. Я понятия не имею, что является причиной и желание знать, как быть в состоянии ввести значение с плавающей запятой при решении этой проблемы. Ниже приведен мой код, а Django - это версия 2.0

# Model.py
class Profile(models.Model):

    class Meta(object):
        db_table='profile'

    user=models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,
                          primary_key=True)
    weight=models.FloatField(_('weight'),blank=False)
    height=models.FloatField(_('height'),blank=False)
    bmi=models.FloatField(_('BMI'))


    def __str__(self):
        return self.user.nickname


# Form.py
class BioRegisterForm(forms.ModelForm):
    class Meta:
        model=Profile
        fields=('weight','height')
        help_texts={'weight':('Kg単位で入力してください'),'height':('cm単位で入力して下さい')}

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.fields['weight'].widget.attrs={'placeholder':'Weight','required':True}
        self.fields['height'].widget.attrs={'placeholder':'Height','required':True}

    def clean_hight(self):
        value=self.cleaned_data.get('height')
        if value<50:
            raise forms.ValidationError('Type in with 「cm」')
        return value

# View.py
class BioRegisterView(CreateView):
    model=Profile
    template_name='mysite/bioregister.html'
    form_class=BioRegisterForm
    success_url=reverse_lazy('mysite/profile.html')

, а следующий - биорегистр. html, рассматриваемая страница

<form method='post' action="">
{% for field in form %}
<div>
    <div class='entry'>
        {{field}}
    </div>
    {%if field.errors %}
    <p> {{field.errors.0}}</p>
    {% endif %}
</div>
{%  endfor %}
{% csrf_token %}
<input type="submit" value="Register" class='bottun2'>
</form>

enter image description here

Спасибо

1 Ответ

1 голос
/ 21 января 2020

Прежде всего, как указано в документах :

Виджетом формы по умолчанию для этого поля является NumberInput, когда localize равен False или TextInput в противном случае.

Когда вы спрашиваете о спиннерах в вашем виджете: это просто способ, которым ваши браузеры отображают NumberInput.. Вы можете сделать их невидимыми, используя css.

Однако для NumberInput чтобы принять любое десятичное значение, атрибут шага ввода должен быть установлен на «любой». Это то, что django обычно делает при создании виджета для FloatField.

Но вы вручную устанавливаете атрибуты своего виджета, а вы не устанавливаете атрибут шага. Я полагаю, что значением по умолчанию, если не задано значение stap, является 1, что означает, что вы можете вводить только целые числа.

Я бы порекомендовал установить ваши атрибуты следующим образом, чтобы преодолеть эту проблему:

self.fields['weight'].widget.attrs.update({'placeholder':'Height','required':True})

Таким образом, вы не пропустите ничего важного django наборов по умолчанию.

Некоторая дополнительная информация:

widget.attrs - это dict с атрибутами django, используемыми для рендеринга виджет на странице html. Для некоторых виджетов django уже создает атрибуты при создании поля. Так что в вашем случае после вызова super().__init__(*args, **kwargs) атрибуты виджета ввода с плавающей запятой это dict: {'step': 'any'}.

Теперь с вашей исходной строкой self.fields['weight'].widget.attrs={'placeholder':'Weight','required':True} вы сбрасываете значение атрибута attrs на {'placeholder':'Weight','required':True}, что означает, что у ваших атрибутов больше нет клавиши 'step'. Поведение по умолчанию NumberInput без атрибута 'step' - принимать только целые числа.

Поэтому, когда вы обновляете attrs dict (как показано выше) вместо его замены, вы убедитесь, что значения в dict, который django уже установлен и который вы не хотите изменять, не затрагиваются, а атрибуты, которые вы хотите добавить / изменить, помещаются в существующий dict.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...