【问题标题】:setting help_text for each choice in a RadioSelect为 RadioSelect 中的每个选项设置 help_text
【发布时间】:2011-01-13 08:45:57
【问题描述】:

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

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

下面是模型和表单的代码,我可以在带有标签、输入元素和帮助文本的模板中呈现名称属性。我还希望能够使用标签(“会员类型”)、单选按钮(“开放会员”和“关闭会员”)以及与每个单选元素关联的帮助文本(“任何人都可以加入此组”和“只有选定的成员才能加入该组”)。

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 }

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    元组的第二个元素出现在“标签”标签内——所以任何'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 为每个单选选项创建扩展描述

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

    • 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)
    

    这可能发生在您的 view 代码中。现在看看 form

    中发生了什么
    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()
            )
    

    【讨论】:

      【解决方案2】:

      假设您使用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 的严格使用,但在大多数情况下它应该可以完成工作。

      【讨论】:

      • 在您的示例中,您设置了一个 id 和 label 属性。我已经拥有了这两个属性,我正在寻找添加第三个属性;帮助文本。
      • 也许如果您向我们展示一些代码,我们将能够提供更多帮助。现在,我不明白您要实现的目标是使用 idlabel 属性无法实现的目标。
      • 我用更多信息和代码 sn-ps 更新了问题,感谢您查看此内容。
      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多