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">
需要帮忙.
为什么不使用 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)
从文档中:
Django 1.4 中的新功能。
为了对生成的标记进行更精细的控制,您可以循环遍历模板中的单选按钮。假设一个表单
myform有一个beatles使用 aRadioSelect作为其小部件的字段:Run Code Online (Sandbox Code Playgroud){% for radio in myform.beatles %} <div class="myradio"> {{ radio }} </div> {% endfor %}
在您的模板中,您应该具有以下内容:
{% 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)
| 归档时间: |
|
| 查看次数: |
1080 次 |
| 最近记录: |