2015-11-05 1 views
1

я определяю пользовательский объект макета:Pass значение поля для пользовательских 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? Как я могу получить значение min/max из соответствующего поля Formfield?

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

Если я правильно понимаю это, пользовательский 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, что field, который передается в шаблон является BoundField объектом, а не IntegerField, которую вы определили в своем классе формы. То, что объект is stored in BoundField.field - следовательно field.field.

BoundField имеет метод value(), поэтому field.value работ.

+0

Спасибо, но это не работает для меня. Эти значения пустые в моем шаблоне, за исключением {{field.value}}, который имеет правильное значение. Как я могу получить доступ к контексту, чтобы увидеть, какие ценности/объекты доступны? Я хотел бы взглянуть на объект 'field' в контексте. У тебя есть трюк? У меня установлен django-debug-toolbar, но я не могу видеть объект 'field' в этом контексте. Можно ли заглянуть в оболочку iPython при рендеринге конкретного шаблона (своего рода контрольная точка шаблона)? – dangonfast

+0

Поместите ['{% debug%}'] (https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#debug) в верхней части вашего шаблона - это приведет к выгрузке контекста для вас осмотреть. – solarissmoke

+0

Я сделал это, а также использовал панель инструментов django-debug и просмотрел реализацию хрустящей формы и использовал templatetag для запуска отладчика внутри шаблона (как pdb, так и ipdb) и просмотрел файл django.template.context .RequestContex, и ... но я просто не могу найти, как перечислять все доступные свойства объекта контекста поля. 'max_value' и' min_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 installipython и ipdb)

Это пример сеанса:

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}}. Не знаю, зачем нужен двойной спецификатор поля, но он работает.

 Смежные вопросы

  • Нет связанных вопросов^_^