Удалить ведущие нули в Django

Я показываю данные из моей базы данных MySQL. Я хотел бы удалить начальные нули в определенных полях (поля ops и obp), Только, когда значение слева от десятичной точки равно 0. Если цифра (цифры) слева от десятичной точки не 0, то я, очевидно, хочу, чтобы это отображалось.

Например,

  • 0,750 становится 0,750

  • 1.000 остается как есть

Я подозреваю, что это можно сделать при вызове данных с использованием шаблона django или в файле views.py. Как бы я поступил?

Любая помощь в этом будет принята с благодарностью! Спасибо.

просмотры.py

from django.shortcuts import render
from .models import BattingRegStd


# Create your views here.
def batting(request):
    battingregstd2018 = BattingRegStd.objects.filter(year=2018)
    return render(request, 'playerstats/battingReg2018.html', {'battingregstd2018':battingregstd2018})

модели.py

class BattingRegStd(models.Model):
    id = models.IntegerField(db_column='ID', primary_key=True)  # Field name made lowercase. 
    obp = models.FloatField(db_column='OBP', blank=True, null=True)  # Field name made lowercase.
    ops = models.FloatField(db_column='OPS', blank=True, null=True)  # Field name made lowercase.
    tb = models.IntegerField(db_column='TB', blank=True, null=True)  # Field name made lowercase.

HTML

{% extends "base.html" %} 

{% block contents %}
<div>
    <table>
        <thead>
            <tr>
                <th>OBP</th>
                <th>OPS</th>
                <th>TB</th>
            </tr>
        </thead>
        <tbody>
            {% for index in battingregstd2018%}
                <td>{{ index.obp}}</td>
                <td>{{ index.ops}}</td>
                <td>{{ index.tb}}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</div>
{% endblock %}
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
966
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Примеры, которые вы можете подтвердить в оболочке Python, протестированные с Python 3.5.3:

x = "0.750"
x.lstrip("0")
> '.750'

# Included because a normal floating point type won't print trailing zeroes:
from decimal import Decimal
x = Decimal("0.750")
x.to_eng_string().lstrip("0")
> '.750'
str(x).lstrip("0")
> '.750'

Хотя вы не сможете сделать это в шаблонах Django, если только вы не поменяли движок на jinja2 или что-то еще, что позволяет использовать скобки в вызовах методов, вы можете сделать это либо в представлении (возможно, некрасиво, в зависимости от того, как вы вытягивая эти данные) или в простом настраиваемый фильтр шаблонов.

Вы можете использовать

def batting_avg_format(num):
    numstr = str(num)
    if numstr[0]!='0':
        return numstr
    else:
        return numstr[1:]

Либо включите его как метод в свою модель BattingRegStd и примените его, либо непосредственно выполните понимание списка после того, как вы отфильтровали модель, но до рендеринга вашего HTML. Преимущество включения его в качестве метода модели заключается в том, что теперь вы можете вызывать его из шаблона, если единственным параметром в вашем методе является self.

если вы добавите его в свою модель, вы сделаете это немного иначе, поскольку это будет метод-член. для ods вы должны сделать что-то вроде def batting_avg_format(self): numstr=str(self.obs), то есть num будет заменен атрибутом, который вы хотите отформатировать.

Juan Carlos Ramirez 06.03.2019 02:00

Таким образом, ему не нужны никакие параметры, и теперь вы можете сделать {{someobj.batting_avg_format}} из своего шаблона, где someobj — это имя вашего объекта BattingRegStd, например, index в вашем коде.

Juan Carlos Ramirez 06.03.2019 02:02

Может ли кто-нибудь просмотреть мой код, чтобы увидеть, что я делаю неправильно с подходом Хуана? Нажмите на эту ссылку, чтобы перейти к моему коду: codeshare.io/aybOWo

Nick T 06.03.2019 16:04
Ответ принят как подходящий

Я предполагаю, что это значение больше нуля.

просмотры.py

def batting(request):
    battingregstd2018 = BattingRegStd.objects.filter(year=2018)

    for i in range(0, len(battingregstd2018)):
        # if need to edit value
        if battingregstd2018[i].obp is not None and battingregstd2018[i].obp < 1:
            # data edit as string
            # data type does not matter in template
            battingregstd2018[i].obp = str(battingregstd2018[i].obp)[1:]
        if battingregstd2018[i].ops is not None and battingregstd2018[i].ops < 1:
            battingregstd2018[i].ops = str(battingregstd2018[i].ops)[1:]

    return render(request, 'playerstats/battingReg2018.html', {'battingregstd2018':battingregstd2018})




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

{% for index in battingregstd2018%}
    <td>
    {% if index.obp is None %}
    -
    {% elif index.obp < 1 %}
    .{{index.obp|slugify|slice:"1:"}}
    {% else %}
    {{index.obp}}
    {% endif %}
    </td>
{% endfor %}

.{{index.obp|slugify|slice:"1:"}}
|slice может использоваться только в строковом типе данных.
|slugify преобразуется в ASCII для использования |slice. но десятичная точка удалена.
поэтому я добавил . впереди.

пс)
возможно, тип float будет хранить 0.750 как 0.75. если вы хотите 0.750, чем использовать его .{{index.obp|floatformat:"3"|slugify|slice:"1:"}}

это показывает '<' not supported between instances of 'NoneType' and 'int'...Кроме того, как бы я назвал операции в своих шаблонах?

Nick T 06.03.2019 15:54

@NickT, если он работал хорошо раньше (0,750, 1,000, ...), не нужно изменять шаблон. я не видел значение было пустым. Я добавил условие в оператор if.

linizio 06.03.2019 16:27

облом. До сих пор не работает. Теперь он будет отображать шаблон без ошибки, но без изменений. По-прежнему показывает 0 перед десятичной точкой. Я буквально должен был просто скопировать и вставить это в представления, изменить urls.py, чтобы он указывал на представление batting, и вызвать шаблон как <td>{{index.ops|default_if_none:"—"|floatformat:3}}</td>?

Nick T 07.03.2019 15:25

@NickT, я попробую по-другому.

linizio 07.03.2019 18:19

предсказать ... второй работает и самый простой! Видимо мало кто об этом знает. Спрашивал на паре форумов. Много просмотров, всего пара ответов и одно решение! Единственное, что я бы добавил, это |floatformat:"3" в операторе else

Nick T 07.03.2019 21:47

Другие вопросы по теме