为RadioSelect中的每个选项设置help_text

buc*_*ley 8 python django

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

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

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

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 }
Run Code Online (Sandbox Code Playgroud)

Joh*_*Mee 6

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

元组的第二个元素显示在"label"标签内 - 因此任何"内联元素"都是允许的; 例如:

期望的结果

或类似的东西

<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>
Run Code Online (Sandbox Code Playgroud)

简单的例子

诀窍是"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.'))
)
Run Code Online (Sandbox Code Playgroud)

复杂的例子

所以在这个例子中我们:

  1. 将选项组合成一个列表(任何可迭代的结构都可以)
  2. 将结构传递给表单的init以动态创建我们的无线电选项
  3. 使用理解列表为每个无线电选项创建扩展描述

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

  • 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)
Run Code Online (Sandbox Code Playgroud)

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

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()
        )
Run Code Online (Sandbox Code Playgroud)


Ris*_*cha -1

假设您使用 的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)
Run Code Online (Sandbox Code Playgroud)

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

  • 在您的示例中,您设置了 id 和 label 属性。我已经拥有这两个属性,我希望添加第三个属性;帮助文本。 (5认同)