是否有可能为特定对象覆盖django的{{}}?

时间:2015-08-04 14:25:16

标签: python django

E.g。如果我打印SEE HERE对象(我的意思是把{{my_fraction}}放在模板中)我希望它在分母= 1和分数(例如简单的a / b)的情况下打印为整数否则。

实现这一目标的最简单/最优雅的方法是什么?如果我使用{{object}}?

,我可以覆盖模板中呈现的内容吗?

我知道我可以使用{%if%}语句,但这对我来说似乎非常不优雅(而且我的HTML代码也会一团糟)

4 个答案:

答案 0 :(得分:2)

fractions.Fraction(1, 1)在字符串上下文

中使用时已输出1
>>> fractions.Fraction(1, 1).__str__()
'1'
>>> fractions.Fraction(1, 1).__unicode__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Fraction' object has no attribute '__unicode__'
>>> fractions.Fraction(1, 1).__repr__()
'Fraction(1, 1)'
>>> unicode(fractions.Fraction(1,1))
u'1'
>>> str(fractions.Fraction(1,1))
'1'

答案 1 :(得分:0)

当呈现对象时,Django模板只输出:

def __unicode__():
   return "something arbitrary"

如果您特别想控制输出,则需要将其修补到对象上(不好主意)。相反,你应该使用过滤器,但是你得到{{object|format_fraction}}

@register.filter
def format_fraction(fraction):
  fraction.numerator if fraction.denominator == 1 else fraction

另一种方法是,为了输出目的,将fraction对象继承到DjangoFraction并覆盖__unicode__,但这是一个糟糕的主意。

答案 2 :(得分:0)

您正在寻找django模板标签,有许多builtins但如果您想要特定的内容,您可以随时create custom one

答案 3 :(得分:0)

您可以使用custom template filter

import UIKit

class YourCustomController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var numberField: UITextField!

    private var formatter: NSNumberFormatter!

    override func viewDidLoad() {        
        super.viewDidLoad()       
        numberField.delegate = self

        // Initialize the formatter; minimum value is set to zero; style is Decimal. 
        formatter = NSNumberFormatter()
        formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
        formatter.minimum = 0
    }

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        // Combine the current text field value and the new string
        // character. If it conforms to the formatter's settings then
        // it is valid. If it doesn't then nil is returned and the
        // string character should not be allowed in the text field.         
        return formatter.numberFromString("\(textField.text)\(string)") != nil
    }    
}

使用它:

# e.g. in my_app/templatetags/fraction_tags.py

@register.filter
def pretty_fraction(value):
    if value.denominator == 1:
        return unicode(value.numerator)
    else:
        return unicode(value)