рендеринг виджета формы django

#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 не a MultiValueField , но ваша распаковка, похоже, возвращает несколько значений вместо положительного целого числа. У меня большой опыт работы с виджетами.