2015-11-05 16 views
1

我定义自定义布局对象:通字段值定制layout.Field

Field('slider', template="custom-slider.html") 

documentation看到:

我的自定义滑块:

<div class="slider slider-green" data-prefix="&euro; " data-postfix=",-" data-min="0" data-max="1800" data-value="223"></div> 

但我想参数化这些值。我怎样才能做到这一点?如何在使用layout.Field时将值传递给模板?我怎样才能从相关的Formfield获得最小/最大值?

slider = forms.IntegerField(label="slider", min_value=3, max_value=50) 

如果我正确理解这一点,custom-slider.html是一个功能齐全的django模板。什么是上下文?它是否有权访问相关的表单字段?怎么样?我无法找到一个例子。

回答

1

field传递给该模板的上下文变量,其中包含FormField对象。所以,你应该能够做到这一点:

<div class="slider slider-green" data-prefix="&euro; " data-postfix=",-" 
data-min="{{ field.field.min_value }}" data-max="{{ field.field.max_value }}" 
data-value="{{ field.value }}"></div> 

你必须做field.field的原因是,传递给模板fieldBoundField对象,而不是您在表单类中定义的IntegerField对象is stored in BoundField.field - 因此field.field

BoundField有一个value()方法,这就是为什么field.value的作品。

+0

谢谢,但那不适合我。这些值在我的模板中为空,除了{{field.value}},它具有正确的值。我如何访问上下文以自己查看可用的值/对象?我想看看上下文中的'field'对象。你有什么窍门吗?我安装了django-debug-toolbar,但我无法在上下文中看到“field”对象。渲染特定模板(一种模板断点)时可以放入iPython shell吗? – dangonfast

+0

在模板的顶部放置['{%debug%}'](https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#debug) - 这会将上下文转储到检查。 – solarissmoke

+0

我已经这样做了,并且还使用了django-debug-toolbar,并通过脆皮形式的实现进行浏览,并使用templatetag在模板(pdb和ipdb)中启动调试器,并浏览django.template.context .RequestContex实现,...但我根本找不到如何列出字段上下文对象的所有可用属性。 'max_value'和'min_value'绝对不可用,但'value'是。你怎么知道应该为模板提供什么对象/属性? – dangonfast

1

我打算把我目前的进展放在这里,尽管这还没有解决(但我希望我越来越近)。我曾尝试以下解决这个:

  • 使用django-debug-toolbar:伟大的,但上下文转储是不可读的复杂的模板。这仅仅是一个巨大的__repr__转储,可浏览不是在所有的,缺乏信息(因为__repr__ S按需要被缩短)

  • 在模板中使用{% debug %}:更糟。我看不懂。它可能有助于小型模板,但是如果您有一个包含5个字段和另外三个模板标签的表单,那么阅读该表单会很好。

  • used a pdb breakpoint访问上下文。 pdb为您提供了上下文的交互式界面,但它不易使用。

  • 使用了一个ipdb断点。这是一个更好的,但它不是possible to use magic functions(即使列出)。
  • 使用了embedded ipython shell。这是一款游戏转换器。突然之间,您可以轻松浏览上下文,相关功能,代码,自动打印所有内容,使用标签填充,...

templatetags这已经(文件templatetags/debug.py):

from django.template import Library, Node 


register = Library() 


class PdbNode(Node): 

    def render(self, context): 
     import pdb as pdb_module 
     pdb_module.set_trace() 
     return '' 


class IPdbNode(Node): 

    def render(self, context): 
     import ipdb as ipdb_module 
     ipdb_module.set_trace() 
     return '' 


class EmbedIPythonNode(Node): 

    def render(self, context): 
     from IPython import embed 
     embed() 
     return '' 


@register.tag 
def pdb(parser, token): 
    return PdbNode() 


@register.tag 
def ipdb(parser, token): 
    return IPdbNode() 


@register.tag 
def ipython(parser, token): 
    return EmbedIPythonNode() 

而且你可以用它在模板中,如:

{% load debug %} 
{% ipython %} 
{% pdb %} 
{% ipdb %} 

<row> 
    <div class="col-lg-6""></div> 
    <div class="col-lg-6""> 
    <div class="slider {{field.extra_class}}" data-prefix="{{field.prefix}}" data-postfix="{{field.postfix}}" data-min="{{widget.min}}" data-max="{{widget.max}}" data-value="{{field.value}}"></div> 
    </div> 
</row> 

(您需要pip installipythonipdb

这是一个示例会话:

In [15]: dir(context.dicts[5]['field']) 
Out[15]: 
['__class__', 
'__delattr__', 
'__dict__', 
'__doc__', 
'__format__', 
'__getattribute__', 
'__getitem__', 
'__hash__', 
'__html__', 
'__init__', 
'__iter__', 
'__len__', 
'__module__', 
'__new__', 
'__reduce__', 
'__reduce_ex__', 
'__repr__', 
'__setattr__', 
'__sizeof__', 
'__str__', 
'__subclasshook__', 
'__unicode__', 
'__weakref__', 
'_initial_value', 
'as_hidden', 
'as_text', 
'as_textarea', 
'as_widget', 
'auto_id', 
'css_classes', 
'data', 
'errors', 
'field', 
'form', 
'help_text', 
'html_initial_id', 
'html_initial_name', 
'html_name', 
'id_for_label', 
'is_hidden', 
'label', 
'label_tag', 
'name', 
'value'] 

而且由于采用ipython壳,我能找到的最高值是{{field.field.max_value}}。不知道为什么需要双字段说明符,但它的工作原理。

相关问题