Ярлыки пользовательского выбора и отображение в Django 1.3.1 - PullRequest
0 голосов
/ 07 февраля 2012

Я знаю, что версия Django Dev упростит это с этим дополнением , но есть ли способ настроить поля выбора для переключателей в текущей версии django? Комментированная версия - это то, что я хочу сделать. Проблема в том, что когда форма недействительна, она перезагружается без ввода каких-либо исходных записей.

<div class="category box">
    <p class="question">Category:</p>
    {{ form.category.errors }}
    {{ form.category }}
    {% comment %}
    <ul>
    <li><label for="id_category_0"><input type="radio" id="id_category_0" value="E" name="category"><img src="{{ MEDIA_URL }}images/icons/eating.png"><br />Eating</label></li>
    <li><label for="id_category_1"><input type="radio" id="id_category_1" value="D" name="category"><img src="{{ MEDIA_URL }}images/icons/drinking.png"><br />Drinking</label></li>
    <li><label for="id_category_2"><input type="radio" id="id_category_2" value="S" name="category"><img src="{{ MEDIA_URL }}images/icons/sleeping.png"><br />Sleeping</label></li>
    <li><label for="id_category_3"><input type="radio" id="id_category_3" value="P" name="category"><img src="{{ MEDIA_URL }}images/icons/exploring.png"><br />Exploring</label></li>
    <li><label for="id_category_4"><input type="radio" id="id_category_4" value="O" name="category"><img src="{{ MEDIA_URL }}images/icons/other.png"><br />Other</label></li>
    </ul>
    {% endcomment %}
</div>
<div class="rating box">
    <p class="question">How would you rate it??</p>
    {{ form.rating.errors }}
    {{ form.rating }}
    {% comment %}
    <ul>
        <li><label for="id_rating_0"><input type="radio" id="id_rating_0" value="1" name="rating"><span class="glyph" style="color: lightgreen;">j</span> Must Do</label></li>
        <li><label for="id_rating_1"><input type="radio" id="id_rating_1" value="2" name="rating"><span class="glyph" style="color: lightblue;">l</span> Do</label></li>
        <li><label for="id_rating_2"><input type="radio" id="id_rating_2" value="3" name="rating"><span class="glyph">L</span> Miss</label></li>
    </ul>
    {% endcomment %}
</div>

1 Ответ

1 голос
/ 08 февраля 2012

Проблема в том, что вы обходите логику рендеринга виджета, а это значит, что он не знает, как отобразить текущее выбранное значение.

Вы можете сделать что-нибудь взломанное и проверить данные формы в самом шаблоне. Но лучший способ - создать подкласс forms.widgets.RadioFieldRenderer и написать собственную функцию рендеринга. Я сделал это в этом примере, чтобы отобразить каждый радиовход в отдельном <td>, я проводил тест с несколькими вариантами ответов, где все вопросы имели одинаковый формат ответа.

from django.utils.safestring import mark_safe
from django.utils.encoding import force_unicode
from django.utils.html import conditional_escape

class ReportRadioInput(forms.widgets.RadioInput):
    def __unicode__(self):
        return mark_safe(u'%s' % self.tag())


class ReportRadioRenderer(forms.widgets.RadioFieldRenderer):
    def __iter__(self):
        for i, choice in enumerate(self.choices):
            yield ReportRadioInput(self.name, self.value, self.attrs.copy(), choice, i)    

    def render(self):
        """Outputs a <ul> for this set of radio fields."""
        return mark_safe(u'\n'.join([u'<td class="choice">%s</td>'
                % force_unicode(w) for w in self]))


class AnswerForm(forms.Form):
    def __init__(self, *args, **kwargs):
        questionnaire = kwargs.pop('questionnaire')
        super(AnswerForm, self).__init__(*args, **kwargs)    

        self.fieldsets = []

        for g in questionnaire.groups.all():
            fields = []

            for q in g.questions.all():
                fieldname = 'question_%i' % q.pk
                widget = forms.RadioSelect(renderer=ReportRadioRenderer)
                self.fields[fieldname] = forms.TypedChoiceField(coerce=int, empty_value=None, required=True, label=q.text, choices=CHOICES, widget=widget)
                fields.append(self[fieldname])
            self.fieldsets.append(dict(legend=g.name,fields=fields))

Бит, который вас заинтересует, это ReportRadioRenderer, а использование widget = forms.RadioSelect(renderer=ReportRadioRenderer)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...