为RadioSelect中的每个选项设置help_text

时间:2010-02-05 02:31:52

标签: python django

我可以在任何表单字段上设置help_text属性,但是可以在用于RadioSelect()的选项上设置help_text吗?

我正在寻找一种干净的方式来显示每个单选按钮下的一些帮助信息。

下面是模型和表单的代码,我可以使用标签,输入元素和帮助文本在模板中呈现name属性。我还希望能够使用标签('会员类型'),单选按钮('开放会员资格'和'封闭会员资格')以及与每个广播元素相关联的帮助文本呈现membership_type属性('任何人都可以加入此group'和'only select members可以加入此组')。

class Group(models.Model):
  MEMBERSHIP_CHOICES = (
    ('O', 'Open membership'),
    ('C', 'Closed membership'),
  )

  name = models.CharField(max_length=255)
  membership_type = models.CharField(max_length=1, choices=MEMBERSHIP_CHOICES, default="O")

class GroupForm(forms.ModelForm):
  name = forms.CharField(label="Group name", help_text="Enter a name for your new group")

  class Meta:
    model = Group
    widgets = { "membership_type": forms.RadioSelect }

2 个答案:

答案 0 :(得分:6)

@Rishabh是正确的但我会进一步详细说明,乍一看,它似乎不是解决方案,尽管它是;或者,至少,它可以被克服以获得有用的效果,而不必深入django形式。

元组的第二个元素显示在“label”标签内 - 所以任何'inline elements'都是允许的;例如:

期望的结果

或类似的东西

<ul>
  <li><label for="id_ticket_0">
      <input type="radio" id="id_ticket_0" value="PARTTIME" name="ticket"> 
      <em>Part Time</em> Valid on Friday Night and Saturday Only
  </label></li>
  <li><label for="id_ticket_1">
      <input type="radio" id="id_ticket_1" value="DAYTIME" name="ticket"> 
      <em>Casual</em> Valid on Saturday Only
  </label></li>
  <li><label for="id_ticket_2">
       <input type="radio" id="id_ticket_2" value="EARLYBIRD" name="ticket"> 
       <em>Early Bird</em> Valid on Friday, Saturday, and Sunday. $15 discount for booking before 1am January 3rd, 2011
   </label></li>
</ul>

简单的例子

诀窍是“mark_safe”描述的内容然后填写你需要的东西:

from django.utils.safestring import mark_safe
choices = (
  ('1', mark_safe(u'<em>One</em> | This is the first option. It is awesome')),
  ('2', mark_safe(u'<em>Two</em> | This is the second option. Good too.'))
)

复杂的例子

所以在这个例子中我们:

  1. 将选项组合成一个列表(任何iterable结构都会这样做)
  2. 将结构传递给表单的 init ,以便即时创建我们的广播选项
  3. 使用comprehension list为每个无线电选项
  4. 创建扩展描述

    数据结构: 门票是我自己的课程,它们有属性:

    • tickets.code - 与票证代码中一样
    • 标签 - 简洁的简短描述
    • 帮助 - 更长的说明

    但稍后会有更多相关内容。首先让我们创建一些实例:

    from mymodule import ticket
    # so lets create a few
    fulltime = ticket('FULLTIME',160,'Full Time',
                  "Valid Monday to Friday inclusive")
    parttime = ticket('PARTTIME',110,'Full Time',
                  "Valid outside of business hours only")
    daytime  = ticket('DAYTIME',70,'Day Time',
                  "Valid only on weekends and public holidays")
    
    # and put them together in a list any way you like
    available_tickets = [fulltime, parttime, daytime]
    
    # now create the form
    OrderForm(tickets=available_tickets)
    

    这可能发生在您的视图代码中。现在看看表单中发生了什么

    class OrderForm(ModelForm):
    
        def __init__(self, *args, **kwargs):
            self.tickets = kwargs.pop('tickets')
            super(OrderForm, self).__init__(*args, **kwargs)
    
            choices = [(t.code, mark_safe(u'<em>%s</em> %s' % (t.label, t.help)))
                    for t in self.tickets]
            self.fields['ticket'] = forms.ChoiceField(
                choices = choices,
                widget  = forms.RadioSelect()
            )
    

答案 1 :(得分:0)

假设您使用RadioSelect作为forms.ChoiceField的小部件,您可以执行以下操作:

choices = (('1', 'First help_text here'),
           ('2', 'Second help_text here'),
           ('3', 'Third help_text here'),
          )

class MyForm(forms.Form):
    ...
    choice = forms.ChoiceField(widget = RadioSelect, choices = choices)

这不是对help_text的严格使用,但它应该在大多数情况下完成工作。