Я показываю данные из моей базы данных 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, протестированные с 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.
Таким образом, ему не нужны никакие параметры, и теперь вы можете сделать {{someobj.batting_avg_format}} из своего шаблона, где someobj — это имя вашего объекта BattingRegStd, например, index в вашем коде.
Может ли кто-нибудь просмотреть мой код, чтобы увидеть, что я делаю неправильно с подходом Хуана? Нажмите на эту ссылку, чтобы перейти к моему коду: codeshare.io/aybOWo
Я предполагаю, что это значение больше нуля.
просмотры.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'...Кроме того, как бы я назвал операции в своих шаблонах?
@NickT, если он работал хорошо раньше (0,750, 1,000, ...), не нужно изменять шаблон. я не видел значение было пустым. Я добавил условие в оператор if.
облом. До сих пор не работает. Теперь он будет отображать шаблон без ошибки, но без изменений. По-прежнему показывает 0 перед десятичной точкой. Я буквально должен был просто скопировать и вставить это в представления, изменить urls.py, чтобы он указывал на представление batting, и вызвать шаблон как <td>{{index.ops|default_if_none:"—"|floatformat:3}}</td>?
@NickT, я попробую по-другому.
предсказать ... второй работает и самый простой! Видимо мало кто об этом знает. Спрашивал на паре форумов. Много просмотров, всего пара ответов и одно решение! Единственное, что я бы добавил, это |floatformat:"3" в операторе else
если вы добавите его в свою модель, вы сделаете это немного иначе, поскольку это будет метод-член. для ods вы должны сделать что-то вроде
def batting_avg_format(self): numstr=str(self.obs), то есть num будет заменен атрибутом, который вы хотите отформатировать.