2

画像をアップロードするときに、画像のサイズを自動的に変更して元の画像を保存するモデルがあります。

問題は、管理パネルで画像を保存すると、このエラーが発生することです

float を Decimal に変換できません。最初にフロートを文字列に変換します

File "C:\o\mysite\fruit\models.py" in save
 61.         super(Pic, self).save(*args, **kwargs)
 File "C:\Python26\lib\decimal.py" in __new__
  652.                             "First convert the float to a string")

Exception Type: TypeError at /admin/fruit/pic/add/
Exception Value: Cannot convert float to Decimal.  First convert the float to a string

なぜこのエラーが発生するのかわかりません

私のモデル.py

class Pic(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(
        upload_to="image",
        blank=True
        )
    descrip = models.TextField()
    ratio = models.DecimalField(decimal_places=5,max_digits=10,default=0)

    def __unicode__(self):
        return self.descrip

    def original(self):
        width = self.image.width / float(self.ratio)
        height = self.image.height / float(self.ratio)

        result = "<img src='/media/{0}' height='{1}' width='{2}'>".format(
            self.image, height, width)

    return result

    def save(self, *args, **kwargs):       
        pw = self.image.width
        ph = self.image.height
        mw = 200
        mh = 200

        self.ratio = getWH(pw, ph, mw, mh, 'r')

        super(Pic, self).save(*args, **kwargs)

        if (pw > mw) or (ph > mh):
            filename = str(self.image.path)
            imageObj = img.open(filename)

            ratio = 1

            if (pw > mw):
                ratio = mw / float(pw)
                pw = mw
                ph = int(math.floor(float(ph)* ratio))
            if ( ph > mh):
                ratio = ratio * ( mh /float(ph))
                ph = mh
                pw = int(math.floor(float(ph)* ratio))

            width = getWH(pw, ph, mw, mh, 'w')
            height = getWH(pw, ph, mw, mh, 'h')

            imageObj = imageObj.resize((width, height),img.ANTIALIAS)
            imageObj.save(filename)



def getWH(pw, ph, mw, mh, result):
    ratio = 1

    if (pw > mw):
        ratio = mw / float(pw)
        pw = mw
        ph = int(math.floor(float(ph)* ratio))
    if ( ph > mh):
        ratio = ratio * ( mh /float(ph))
        ph = mh
        pw = int(math.floor(float(ph)* ratio))

    if result == 'w':
        return pw
    elif result == 'h':
        return ph
    else:
        return ratio
4

2 に答える 2

6

Python 2.7 以降の場合:

from decimal import Decimal
Decimal.from_float(234.234)

https://docs.python.org/2/library/decimal.html#decimal.Decimal.from_float

于 2014-05-15T20:27:24.040 に答える
4

公式ドキュメント9.4.8から。10 進数に関するよくある質問

Q. float_to_decimal() ルーチンがモジュールに含まれていないのはなぜですか?

A. 2 進浮動小数点数と 10 進浮動小数点数を混在させることが賢明かどうかについて、いくつかの疑問があります。また、その使用には、バイナリ浮動小数点に関連する表現の問題を回避するために、いくつかの注意が必要です。

ちなみに、与えられたリンクで答えを見つけることができます:

def float_to_decimal(f):
    "Convert a floating point number to a Decimal with no loss of information"
    n, d = f.as_integer_ratio()
    numerator, denominator = Decimal(n), Decimal(d)
    ctx = Context(prec=60)
    result = ctx.divide(numerator, denominator)
    while ctx.flags[Inexact]:
        ctx.flags[Inexact] = False
        ctx.prec *= 2
        result = ctx.divide(numerator, denominator)
    return result

また、この機能は既に Python 2.7 に含まれています。

于 2013-04-18T11:25:30.060 に答える