Django модель FloatField ошибка «объект с плавающей точкой» не имеет атрибута «as_tuple» - PullRequest
1 голос
/ 02 февраля 2020

У меня есть модель Django с FloatField, на которой я позже основываю форму. По какой-то причине я получаю "объект с плавающей точкой не имеет атрибута as_tuple", и, к сожалению, я понятия не имею, почему я получаю эту ошибку или как ее исправить.

models.py:

class Course(models.Model):
    title = models.CharField(max_length = 200)
    author = models.ForeignKey(User,default=None, on_delete=models.SET_DEFAULT)
    description = models.TextField(max_length=1000, blank=True)
    tags = models.TextField(blank = True)
    duration = models.FloatField(validators=(MinValueValidator(0.1),MaxValueValidator(12), DecimalValidator(max_digits=3,decimal_places=2)))


    def __str__(self):
            return self.title

forms.py:

class CourseForm(ModelForm):
    class Meta:
        model = Course
        fields = ('title', 'description', 'price', 'duration', 'tags')

views.py:

@login_required
def create_course(request):
    if request.method == "POST":
        form = CourseForm(request.POST)

        if form.is_valid():

            form.save()
            messages.info(request, f"Course created succesfully!")

        else:
            messages.error(request, "Something went wrong, please resubmit!")


    form = CourseForm()
    return render(request, "main/createcourse.html", {"form": form})

html:

{% extends 'main/header.html' %}
<body>

   {% block content%}
<div class="container">

    <form method="POST">
        {% csrf_token %}

        {{form.as_p}}

        <br>
        <button class="btn" type="submit">Create</button>
    </form>

    If you to modify an existing course, click <a href="/modify"><strong>here</strong></a> instead.
</div>
<br><br>
    {% endblock %}



</body>

1 Ответ

1 голос
/ 02 февраля 2020

Существует разница между float и Decimal. A Decimal кодирует данные, сохраняя цифры десятичного числа. Однако вы можете не выполнять DecimalValidation на float, поскольку из-за ошибок округления к нему добавятся дополнительные цифры.

Таким образом, вы можете использовать DecimalField [Django -doc] вместо. Обратите внимание, что в этом случае вам необходимо передать Decimal объектов, не с плавающей точкой.

class Course(models.Model):
    title = models.CharField(max_length = 200)
    author = models.ForeignKey(User,default=None, on_delete=models.SET_DEFAULT)
    description = models.TextField(max_length=1000, blank=True)
    tags = models.TextField(blank = True)
    duration = models.<b>DecimalField(max_digits=3,decimal_places=2,</b> validators=(MinValueValidator(0.1),MaxValueValidator(12), DecimalValidator(max_digits=3,decimal_places=2))<b>)</b>


    def __str__(self):
            return self.title

Возможно, вы захотите взглянуть на DurationField [Django -doc] для хранения продолжительности, однако, он автоматически использует timedelta и сохраняет его как целое число для баз данных, которые не поддерживают такие типы.

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