@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.'))
)
复杂的例子
所以在这个例子中我们:
- 将选项组合成一个列表(任何iterable 结构都可以)
- 将结构传递给表单的 init 以动态创建我们的单选选项
- 使用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()
)