在django中将自定义html添加到choicefield标签

在django中将自定义html添加到choicefield标签,django,django-forms,django-1.5,django-formwizard,Django,Django Forms,Django 1.5,Django Formwizard,我现在正努力满足一个要求,我想在choice字段标签上添加一个图像,但我真的不知道该怎么做。我正在使用django表单向导来呈现表单。 下面的图片显示了我想要实现的目标: 下面是我现在得到的(为了使单选按钮内联,我知道它可以通过css实现): 以下是forms.py: from django import forms from django.utils.translation import gettext as _ CHOICES=[('0','Pay by card'), ('1','

我现在正努力满足一个要求,我想在choice字段标签上添加一个图像,但我真的不知道该怎么做。我正在使用django表单向导来呈现表单。 下面的图片显示了我想要实现的目标:

下面是我现在得到的(为了使单选按钮内联,我知道它可以通过css实现):

以下是forms.py:

from django import forms
from django.utils.translation import gettext as _


CHOICES=[('0','Pay by card'), ('1','Invoice')]




class PaymentForm(forms.Form):
    title = 'payment'
    payment_method = forms.ChoiceField(label = _("Payment Options"), choices=CHOICES, widget=forms.RadioSelect(), required = True)
我正在使用向导窗体进行渲染:

 {{ wizard.form.payment_method.label_tag }}
                                {{ wizard.form.payment_method|safe }}
                                {{ wizard.form.payment.errors}}

除了自定义小部件之外,还有人对此有什么建议吗?

在模板中执行以下操作:

 {% for choice in wizard.form.payment_method.choices %}
    {{ choice.0 }} {# value #} {{ choice.1 }} {# value #}
    {% if choice.0 == PAYMENT_BY_PAYPAL %}
     ...
    {% endif %}
 {% endfor %}
你也可以写:

  {% for key, value in wizard.form.payment_method.choices %}
    {% if key == PAYMENT_BY_PAYPAL %}
     ...
    {% endif %}
 {% endfor %}
1) 很快(但我不确定)调用一个函数,在该函数中使用“刷卡支付”,并返回您需要的所有

2) 你可以做一些像@Gahbu说的事情

3) 长[我认为更好,但未经测试:(]: 创建渲染器:

from myapp.my_widgets import CardsRadioFieldRenderer

CARD_CHOICE = '0'

CHOICES=[(CARD_CHOICE,'Pay by card'), ('1','Invoice')]

class PaymentForm(forms.Form):
    title = 'payment'
    payment_method = forms.ChoiceField(label = _("Payment Options"), choices=CHOICES,widget=forms.RadioSelect(renderer=CardsRadioFieldRenderer), required = True)

# myapp/my_widgets.py

class CardRadioInput(RadioInput):
    def __init__(self, name, value, attrs, choice, index):
        self.name, self.value = name, value
        self.attrs = attrs
        choice_value = force_text(choice[0])
        self.choice_value = choice_value
        if choice_value == CARD_CHOICE:
            choice_label = force_text(self.get_html_for_card_choice())
        else:
            choice_label = force_text(choice[1])
        self.choice_label = choice_label
        self.index = index

   def get_html_for_card_choice(self):
        #some logic to get the images tags (<img ...> <img ...>)
        return text


class CardsRadioFieldRenderer(RadioFieldRenderer):
    def __getitem__(self, idx):
        choice = self.choices[idx] # Let the IndexError propogate
        return CardRadioInput(self.name, self.value, self.attrs.copy(), choice, idx)
从myapp.my_小部件导入卡片RadioFieldRenderer
卡片_选项='0'
选项=[(卡片选项,'Pay by CARD'),('1','Invoice')]
班级工资表(forms.Form):
标题=‘付款’
payment\u method=forms.ChoiceField(label=(“payment Options”)、choices=choices、widget=forms.RadioSelect(renderer=cardsradiofeldrenderer)、required=True)
#myapp/my_widgets.py
放射性输入(放射性输入)类别:
定义初始化(自我、名称、值、属性、选项、索引):
self.name,self.value=名称,值
self.attrs=attrs
选项值=强制文本(选项[0])
self.choice\u value=选择值
如果选项\值==卡\选项:
choice_label=force_text(self.get_html_for_card_choice())
其他:
选项标签=强制文本(选项[1])
self.choice\u label=choice\u label
self.index=索引
def get_html_for_card_选项(自):
#获取图像标记()的一些逻辑
返回文本
类别CardsRadioFieldRenderer(RadioFieldRenderer):
def uu getitem uu(self,idx):
choice=self.choices[idx]#让索引器传播
返回CardRadioInput(self.name、self.value、self.attrs.copy()、choice、idx)
没有小部件:

from django.utils.safestring import mark_safe
CHOICES=[('0', mark_safe('Pay by card <img src="by_card.jpg"/>')),
         ('1', mark_safe('Invoice <img src="no_card.jpg"/>'))
]
来自django.utils.safestring导入标记\u safe
选项=[('0',标记安全('Pay by card')),
(“1”,标记“保险柜”(“发票”))
]

信用证:

如果你想从模板中调整它,你需要使用“保险箱”,它告诉Jinja不要逃避它。如下所示

{{ some_object.some_property|safe }}
但是,如果您想在定义表单/模型表单时在python代码中使用它,只需使用下面的mark_safe即可

mark_up = 'this is a <a href="http://www.google.com">link</a>'
choices = list()
choices.append(('some_id', mark_safe(mark_up)))
self.fields['some_field'].choices = choices
mark_up='这是一个'
选项=列表()
附加(('some_id',mark_safe(mark_up)))
self.fields['some_field'].choices=choices

取决于表单的呈现方式。如果使用form.as\p()或者类似的内置函数,您必须重写此行为。您也可以用html手动生成表单。我刚刚编辑了我的问题。是的,我也是,请参见上文。PAYMENT_BY_PAYPAL是密钥名吗?在我的问题中哪个是“0”?是的,在您的情况下,它是“0”,另一个是“1”。即使我也不确定是否可以实现第1点,但Gahbu是解决方案目前对我不起作用,我保留第3点作为最后一个选项,我只是不确定是否有任何简单的解决方案来实现这一点,所以考虑将其发布在这里。