2014-10-16 3 views
0

Я написал собственный виджет для поля формы в Django, и я вижу вид HTML-вывода, который я хочу, но поле не возвращается в cleaned_data ,Данные поля поля Django, потерянные при использовании пользовательского виджета

HTML является частью формы на этой странице, так же есть проблема с моим виджетами?

# forms.py 

class EntrantDetails(forms.Form): 
    TITLE_CHOICES = (
     ('', 'Select:'), 
     ('Mr', 'Mr'), 
     ('Mrs', 'Mrs'), 
     ('Miss', 'Miss'), 
     ('Ms', 'Ms'), 
     ('Dr', 'Dr'), 
    ) 
    GENDER_CHOICES = (
     ('M', 'male'), 
     ('F', 'female'), 
    ) 
    title = forms.CharField(
     max_length=20, 
     widget=forms.widgets.Select(choices=TITLE_CHOICES) 
    ) 
    first_name = forms.CharField(max_length=200) 
    middle_names = forms.CharField(
     label='Middle name(s)', 
     max_length=200, required=False 
    ) 
    last_name = forms.CharField(max_length=200) 
    date_of_birth = forms.DateField(
     widget=SelectDateWidget(years=range(2015, 1900, -1)) 
    ) 
    gender = forms.CharField(
     max_length=1, 
     widget=ButtonSelectWidget(cls='test_class', choices=GENDER_CHOICES) 
    ) 


# widgets.py 

class ButtonSelectWidget(Widget): 
    """ 
    Custom widget to display a choice field more like selectable buttons. 
    """ 

    def __init__(self, attrs=None, cls=None, choices=None): 
     self.attrs = attrs or {} 
     self.cls = cls 
     self.choices = choices 

    def render(self, name, value, attrs=None, choices=()): 
     if not choices: 
      choices = self.choices 
     output = [] 
     output.append(u'<div class="controls">') 

     for choice in choices: 
      label = u'{}'.format(choice[1]) 
      output.append(u''' 
      <div class="radio radio-{label}"> 
       <input id="user_{name}_{label}" name="user[{name}]" type="radio" value="{choice}"> 
       <label for="user_{name}_{label}">{title}</label> 
      </div> 
      '''.format(name=name, choice=choice[0], label=label, title=label.title())) 
     output.append(u'</div>') 


     return mark_safe(u'\n'.join(output)) 

ответ

1

Имя входа в разметке неверно, поэтому форма не собирает его. Вместо

<input id="user_{name}_{label}" name="user[{name}]" type="radio" value="{choice}"> 

вам нужно

<input id="user_{name}_{label}" name="{name}" type="radio" value="{choice}"> 

Также стандартная схема для управления id в Django форм id_<name>[_counter]

Теперь Django уже есть RadioSelect виджет, который дает вам ту же функцию, поэтому вам лучше использовать его (с вашей собственной разметкой в ​​шаблоне) вместо того, чтобы повторно изобретать конкретный шаблон проекта (квадрат) и жесткий шаблон проекта вашего виджета.

+0

О, это имеет смысл. Я решил использовать этот подход, потому что шаблон уже является монстром, так как это единственный шаблон для группы форм-форм форм, и я хотел избежать дополнительных условных блоков. –

+1

Вам не нужны условные выражения для обработки шаблона каждой формы в мастере ... Просто передайте путь шаблона правой формы в контексте и '{% include%} 'it. wrt/fields, вы можете либо 1. использовать разметку по умолчанию, либо использовать макросы (https://pypi.python.org/pypi/django-templates-macros) или еще один расширенный пакет, например floppyforms, для применения собственной разметки везде. Мои 2 цента ... –

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