如何添加<div>标签而不是<li>

Mon*_*k L 5 python django django-templates django-models django-forms

forms.py

class TypeSelectionForm(forms.Form):
    checkbox_field = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(), label="", required=False)

def __init__(self, type_id, *args, **kwargs):
    super(TypeSelectionForm, self).__init__(*args, **kwargs)

    _type_checkbox = self.fields['checkbox_field']       
    MY_CHOICES=((type.id, type.title) for type in type)
    _type_checkbox.choices = MY_CHOICES
    initial_val = []
    type_selection = Types.objects.filter(parent_type_id=type_id,is_active=True)
    for type_selection in type_selection:
        initial_val.append(type_selection.id)
    _type_checkbox.initial = initial_val
Run Code Online (Sandbox Code Playgroud)

views.py

def types(method):
    """"""""""""
    types = TypeSelectionForm(type_id)
    return render(request,'types.html',{'types':types})
Run Code Online (Sandbox Code Playgroud)

在模板中,我正在渲染这样的字段,

types.html

    {% for field in types.checkbox_field %}                                 
     <div class="deletelist">
     {{field}}<br />
    </div>
   {% endfor %}
Run Code Online (Sandbox Code Playgroud)

它正在生成像这样的html,

<ul>
<li><label for="id_checkbox_field_0"><input checked="checked" type="checkbox" name="checkbox_field" value="597" id="id_checkbox_field_0" /> comp lab</label></li>
<li><label for="id_checkbox_field_1"><input checked="checked" type="checkbox" name="checkbox_field" value="598" id="id_checkbox_field_1" /> phy lab</label></li>
<li><label for="id_checkbox_field_2"><input checked="checked" type="checkbox" name="checkbox_field" value="599" id="id_checkbox_field_2" /> chem lab</label></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我想替换<ul><li>标签<div class="class-name">

需要帮忙.

bha*_*ppy 5

为什么不使用 Django 模板标签的强大功能呢?

from django import template
from django.utils.safestring import mark_safe
register = template.Library()


@register.filter("as_div")
def as_div(form):
    form_as_div = form.as_ul().replace("<ul", "<div").replace("</ul", "</div")
    form_as_div = form_as_div.replace("<li", "<div").replace("</li", "</div")
    return mark_safe(form_as_div)
Run Code Online (Sandbox Code Playgroud)

把它放在一个模板标签中,然后在你的模板中简单地做到这一点

{% load ad_div %}

{# some Code #}

{{ form|as_div }}

{# some other code #} 
Run Code Online (Sandbox Code Playgroud)

============================

其他方法(更好的清洁工)

另一种方法是扩展 django 表单模型

如下

from django.forms.forms import BaseForm

Class AsDiv(BaseForm):

def as_div(self):
        return self._html_output(
            normal_row = u'<div%(html_class_attr)s>%(errors)s%(label)s %(field)s%(help_text)s</div>',
            error_row = u'<div>%s</div>',
            row_ender = '</div>',
            help_text_html = u' <span class="helptext">%s</span>',
            errors_on_separate_row = False)
Run Code Online (Sandbox Code Playgroud)

那么你可以这样做,这是你的模板

{{ form.as_div }} 
Run Code Online (Sandbox Code Playgroud)


Bur*_*lid 1

文档中:

Django 1.4 中的新功能。

为了对生成的标记进行更精细的控制,您可以循环遍历模板中的单选按钮。假设一个表单myform有一个beatles使用 aRadioSelect作为其小部件的字段:

{% for radio in myform.beatles %}
<div class="myradio">
    {{ radio }}
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

在您的模板中,您应该具有以下内容:

{% for radio in types.checkbox_field %}
   <input style="margin: 8px -3px;float: left;" type="button" class="delete_types" id="delete_name"/>{{ radio }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

您还应该使用ModelMultipleChoiceField

class TypeSelectionForm(forms.Form):
    checkbox_field = forms.ModelMultipleChoiceField(label="",
                                                    queryset=Types.objects.none(),
                                                    required=False)

    def __init__(self, *args, **kwargs):
        qs = kwargs.pop('queryset')
        super(TypeSelectionForm, self).__init__(*args, **kwargs)
        self.fields['checkbox_field'].queryset = qs
Run Code Online (Sandbox Code Playgroud)

从你的角度来看,这样启动它:

def types(method):
    """"""""""""
    qs = Types.objects.filter(parent_type_id=type_id,is_active=True)
    types = TypeSelectionForm(queryset=qs)
    return render(request,'types.html',{'types':'types'})
Run Code Online (Sandbox Code Playgroud)