Wie man <div> tag anstelle von <li> hinzufügt

Form.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 

Views.py

 def types(method): """""""""""" types = TypeSelectionForm(type_id) return render(request,'types.html',{'types':types}) 

In Vorlage mache ich das Feld so,

Types.html

  {% for field in types.checkbox_field %} <div class="deletelist"> {{field}}<br /> </div> {% endfor %} 

Es ist die Herstellung der html wie diese,

 <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> 

Ich möchte das <ul> und <li> Tag mit <div class="class-name"> ersetzen

Brauche Hilfe.

4 Solutions collect form web for “Wie man <div> tag anstelle von <li> hinzufügt”

Warum nicht die Macht der Django-Vorlage-Tags verwenden?

 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) 

Setzen Sie das in ein Template-Tag und dann tun dies einfach in Ihrer Vorlage

 {% load ad_div %} {# some Code #} {{ form|as_div }} {# some other code #} 

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

Anderer Ansatz (Besserer Reiniger)

Ein weiterer Ansatz wäre, django Formen Modell zu erweitern

wie folgt

 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) 

Dann könntest du das einfach machen

 {{ form.as_div }} 

Aus der Dokumentation :

Neu in Django 1.4.

Für eine körnigere Kontrolle über das generierte Markup können Sie die Optionsfelder in der Vorlage durchlaufen. Angenommen, ein Formular myform mit einem Feld beatles , die ein RadioSelect als sein Widget verwendet:

 {% for radio in myform.beatles %} <div class="myradio"> {{ radio }} </div> {% endfor %} 

In deiner Vorlage solltest du das haben:

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

Sie sollten auch ein 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 

Lasse es so aus deiner Ansicht ein:

 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'}) 

Widgets nehmen ein attrs Attribut, das das Attribut zu jedem Eingang hinzufügen sollte. Versuche dies:

 checkbox_field = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(attrs={'class': 'my-image-class', }), label="", required=False) 

AKTUALISIEREN:

So sieht es aus wie der oben genannte körnige Ansatz funktioniert nur für Funkknopf-Widgets. Aber was du willst ist eigentlich ganz einfach Geben Sie Ihre Checkboxen wie gewohnt aus:

 {% for field in types.checkbox_field %} {{field}} {% endfor %} 

Dies wird Ihre Liste der Checkboxen, wie Sie benötigen, ausgeben. Dann benutze einfach ein kleines CSS, um das Hintergrundbild jedes Listenelements zu stylen:

 form ul li { background:url("<my-image>") no-repeat center; width:20px; height:20px; 

}

AKTUALISIEREN

Wenn du die Kontrollkästchen anders machen möchtest, brauchst du eine benutzerdefinierte Widget-Klasse, da das der Widgets-Job ist. Etwas wie dieses wird dich gehen. Ich würde persönlich die attrs Option auf das Widget verwenden, um in einer Klasse hinzuzufügen, aber ich habe es hart codiert es hier, um Ihnen zu zeigen, dass das, was Sie fragen, ist möglich, einfach nicht schön:

 class CheckboxDivSelectMultiple(CheckboxSelectMultiple): '''renders the checkboxes as divs with a hard coded class''' def render(self, name, value, attrs=None, choices=()): if value is None: value = [] has_id = attrs and 'id' in attrs final_attrs = self.build_attrs(attrs, name=name) output = [u'<div>'] # Normalize to strings str_values = set([force_unicode(v) for v in value]) for i, (option_value, option_label) in enumerate(chain(self.choices, choices)): # If an ID attribute was given, add a numeric index as a suffix, # so that the checkboxes don't all have the same ID attribute. if has_id: final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i)) label_for = u' for="%s"' % final_attrs['id'] else: label_for = '' cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values) option_value = force_unicode(option_value) rendered_cb = cb.render(name, option_value) option_label = conditional_escape(force_unicode(option_label)) output.append(u'<div class="%s"><label%s>%s %s</label></div>' % ('new-class', label_for, rendered_cb, option_label)) output.append(u'</div>') return mark_safe(u'\n'.join(output)) 

Benutze es in deiner form:

 checkbox_field = forms.MultipleChoiceField(widget=forms.CheckboxDivSelectMultiple(), label="", required=False) 

Das ist vergleichbar mit der Lösung von @bhappy. Die Gesamtlösung besteht darin, eine benutzerdefinierte as_div-Methode zu definieren und sie als Vorlagenfilter in Ihren Vorlagen zu verwenden. Werfen Sie einen Blick auf diese Django Snippets Post: Custom Form Beispiel: Formulare für Bootstrap Html – CSS Toolkit

  • Django: Wie kann man Modelle aus der Datenbank aktualisieren oder neu laden
  • In django ändern Sie den Dateinamen einer hochgeladenen Datei
  • Django admin viele zu viele Teilmenge
  • Wie man Berechtigungen in Django zu Modellen hinzufügen und es mit der Shell testen
  • Daten aus Form und Anzeige in Vorlage abrufen
  • Wie kann man Ergebnisdatei mit Django bedienen?
  • Python ist die beste Programmiersprache der Welt.