Как использовать MultiWidget Django?
документация немного отсутствует в отношении этой функции.
from django import forms
class TwoInputWidget(forms.MultiWidget):
"""An example widget which concatenates two text inputs with a space"""
def __init__(self, attrs=None):
widgets = [forms.TextInput, forms.TextInput]
Я вижу, что мне нужно создать свойство "виджеты" со списком других виджетов, но после этого он получает немного Шерлока Холмса.
кто-нибудь, пожалуйста, объясните мне, как использовать виджет MultiWidget?
2 ответов
интересный вопрос, и я думаю, возможно, заслуживает немного больше внимания в документах.
вот пример вопрос, который я только что задал:
class DateSelectorWidget(widgets.MultiWidget):
def __init__(self, attrs=None, dt=None, mode=0):
if dt is not None:
self.datepos = dt
else:
self.datepos = date.today()
# bits of python to create days, months, years
# example below, the rest snipped for neatness.
years = [(year, year) for year in year_digits]
_widgets = (
widgets.Select(attrs=attrs, choices=days),
widgets.Select(attrs=attrs, choices=months),
widgets.Select(attrs=attrs, choices=years),
)
super(DateSelectorWidget, self).__init__(_widgets, attrs)
def decompress(self, value):
if value:
return [value.day, value.month, value.year]
return [None, None, None]
def format_output(self, rendered_widgets):
return u''.join(rendered_widgets)
что я сделала?
- наследование
django.forms.widgets.MultiWidget
- реализован конструктор, который создает несколько
widgets.WidgetName
виджеты в кортеж. Это важно, потому что супер класс использует существование этого кортежа, чтобы заботиться о нескольких вещах для вы. - мой формат вывода является сквозным, но идея в том, что вы можете добавить пользовательский html здесь, Если хотите
- я также реализовал
decompress
потому что вы должны-вы должны ожидать, что будут переданы значения из базы данных в одном 'ы оказываем:def render(self, name, value, attrs=None): html = super(MarkItUpWidget, self).render(name, value, attrs) if self.auto_preview: auto_preview = "$('a[title=\"Preview\"]').trigger('mouseup');" else: auto_preview = '' html += ('<script type="text/javascript">' '(function($) { ' '$(document).ready(function() {' ' $("#%(id)s").markItUp(mySettings);' ' %(auto_preview)s ' '});' '})(jQuery);' '</script>' % {'id': attrs['id'], 'auto_preview': auto_preview }) return mark_safe(html)
-
value_from_datadict
- вижу, мой вопрос здесь. value_from_datadict вытягивает значение, связанное с этот виджет из словаря данных всех представленных данных с этой формой. В случае multiwidget, представляющего одно поле, вам нужно восстановить это значение из нескольких подвиджетов, так как данные будут отправлены. -
_get_media
может быть полезно для вас, если вы хотите получить медиа, используя представление Django медиа. Реализация по умолчанию циклы виджетов, запрашивающих медиа; если вы подкласс его и используете какие-либо причудливые виджеты вы нужно позвонить супер; если ваш виджет нуждается в каких-либо медиа, то вам нужно добавить его с помощью этого.
например, markitupвиджет django делает это:
def _media(self): return forms.Media( css= {'screen': (posixpath.join(self.miu_skin, 'style.css'), posixpath.join(self.miu_set, 'style.css'))}, js=(settings.JQUERY_URL, absolute_url('markitup/jquery.markitup.js'), posixpath.join(self.miu_set, 'set.js'))) media = property(_media)
опять же, он создает кортеж путей к правильному местоположению, так же, как мой виджет создал кортеж виджетов в
__init__
метод.Я думаю, что охватывает его для важных частей
MultiWidget
класса. То, что ты пытаешься сделать, зависит от того, что у тебя есть. создал / какие виджеты вы используете, поэтому я не могу легко вдаваться в детали. Однако, если вы хотите увидеть базовый класс для себя и взглянуть на комментарии, взгляните на источник. -
прочитайте это запись в блог и связанный Django фрагмент. Надеюсь, это даст вам некоторые идеи.