#python #django #django-forms
#python #django #django-forms
Вопрос:
эй, ребята, я хочу создать виджет, который отображает поле телефона в следующем формате
box - box2 - box3
я пробовал разные фрагменты кода, представленные на этом же сайте, однако они не переопределяют рендеринг html, что я и хочу сделать
например, это:
class USPhoneNumberMultiWidget(forms.MultiWidget):
"""
A Widget that splits US Phone number input into three <input type='text'> boxes.
"""
def __init__(self,attrs=None):
widgets = (
forms.TextInput(attrs={'size':'3','maxlength':'3', 'class':'phone'}),
forms.TextInput(attrs={'size':'3','maxlength':'3', 'class':'phone'}),
forms.TextInput(attrs={'size':'4','maxlength':'4', 'class':'phone'}),
)
super(USPhoneNumberMultiWidget, self).__init__(widgets, attrs)
def decompress(self, value):
if value:
return value.split('-')
return (None,None,None)
def value_from_datadict(self, data, files, name):
value = [u'',u'',u'']
# look for keys like name_1, get the index from the end
# and make a new list for the string replacement values
for d in filter(lambda x: x.startswith(name), data):
index = int(d[len(name) 1:])
value[index] = data[d]
if value[0] == value[1] == value[2] == u'':
return None
return u'%s-%s-%s' % tuple(value)
рендеринг html-ввода:
box|box2|box3
итак, как я могу перезаписать рендеринг, чтобы он отображался:
box - box2 - box3
я также был бы признателен за любую документацию, объясняющую, как создавать пользовательские виджеты, пока я не нашел ни одного
models.py:
class Preference(models.Model):
phone = models.PositiveIntegerField(blank=True)
class PreferenceForm(ModelForm):
class Meta:
model = Preference
widgets = {
'phone':USPhoneNumberMultiWidget(attrs={'class':'firstnumberbox', 'id':'firstcellphone', 'name':'firstphone'}),
Визуализация Html:
<dt><label for="firstcellphone"> Cell Phone:</label></dt>
<dd class="phones"><input name="firstphone" id="firstcellphone_0" maxlength="3" type="text" class="firstnumberbox" size="3" /> - <input name="firstphone" id="firstcellphone_1" maxlength="3" type="text" class="firstnumberbox" size="3" /> - <input name="firstphone" id="firstcellphone_2" maxlength="4" type="text" class="firstnumberbox" size="4" /></dd>
Ответ №1:
Вы можете переопределить метод format_output мультивиджета:
def format_output(self, rendered_widgets):
return u'%s - %s - %s' %
(rendered_widgets[0], rendered_widgets[1], rendered_widgets[2])
Нет тонны документации по пользовательским виджетам форм. Я создал только пару, и с ними пришлось много возиться. Надеюсь, это поможет!
Комментарии:
1. спасибо за ваш ответ, он отлично работал при рендеринге формы, но, к сожалению, виджет ничего не отправляет в базу данных, я опубликую свои модели. py conf в исходном вопросе
2. @paulo это может помочь увидеть отрисованный html? Возможно, входные данные не отображаются с идентификатором?
3. В виджете для футов и дюймов у меня есть фрагменты на Django: djangosnippets.org/snippets/2327 Мне не нужно было добавлять какие-либо атрибуты для идентификатора или имени, и в итоге я использовал этот виджет во встроенной и обычной форме без каких-либо проблем. Я не уверен, почему значения не будут в СООБЩЕНИИ, но, пожалуйста, взгляните на этот фрагмент. Это может привести вас в правильном направлении.
4. @джеймс, хорошо, я опубликую это, @brandon сделает
5. @paulo После перечитывания вашего поста я заметил, что вы используете
PositiveIntegerField
не aMultiValueField
, но ваша распаковка, похоже, возвращает несколько значений вместо положительного целого числа. У меня большой опыт работы с виджетами.