example python django django-forms django-widget

python - tkinter text get example



Widget personalizado que no valida solo la primera vez (1)

Copié y pegué tu código en una aplicación rápida de django. Funcionó bien para mí. ¿Hay otros lugares donde el error podría ser? Django 1.4 en OS x.

views.py

class OrderedCheckboxSelectMultiple(CheckboxSelectMultiple): 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''<ol class="numeric">''] # 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''<li class="liAll"><label%s class="checkbox inline">%s <span class="spanLabel">%s</span></label></li>'' % ( label_for, rendered_cb, option_label)) output.append(u''</ol>'') return mark_safe(u''/n''.join(output)) class SomeForm(forms.Form): alert1 = MultipleChoiceField(choices=[(a.id, a.name) for a in Widget.objects.filter(a=False)], widget=OrderedCheckboxSelectMultiple()) alert2 = MultipleChoiceField(choices=[(a.id, a.name) for a in Widget.objects.filter(a=False)], widget=OrderedCheckboxSelectMultiple()) def index(request): if request.method =="POST": form = SomeForm(request.POST) print(request.POST.keys()) if form.is_valid(): print("trying to save") else: form = SomeForm() return render_to_response(''publichome.html'', locals(), context_instance=RequestContext(request))

He creado un widget personalizado OrderedCheckboxSelectMultiple , estoy reemplazando <ul> por <ol> y agregando algunas clases a <label> , <li> , etc .:

class OrderedCheckboxSelectMultiple(forms.CheckboxSelectMultiple): 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''<ol class="numeric">''] # 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 = forms.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''<li class="liAll"><label%s class="checkbox inline">%s <span class="spanLabel">%s</span></label></li>'' % ( label_for, rendered_cb, option_label)) output.append(u''</ol>'') return mark_safe(u''/n''.join(output))

Estoy usando este widget en un formulario en dos campos diferentes:

class SomeForm(forms.Form): # more fields here alert1 = forms.MultipleChoiceField(choices=[(a.id, a.description) for a in SomeModel.objects.filter(a=True)], widget=OrderedCheckboxSelectMultiple()) alert2 = forms.MultipleChoiceField(choices=[(a.id, a.description) for a in SomeModel.objects.filter(b=True)], widget=OrderedCheckboxSelectMultiple())

El problema es que, cuando envío el formulario por primera vez , recibo un error de validación:

Select a valid choice. is not one of the available choices.

Luego, cuando vuelvo a marcar las opciones, se valida sin problemas. Estoy perdido aquí. ¿Alguna sugerencia?

Nota:

Lo mismo sucede si uso forms.CheckboxSelectMultiple como widget para alert1 y alert2 .

Editar:

Durante la depuración, puedo ver que alert1 y alert2 no están presentes en la request.POST alert2 la primera vez que envío.

Lo siento, cometí un error. alert1 y alert2 están presentes en request.POST pero son ambos a pesar de estar marcados.

Editar 2:

Al utilizar el elemento "Examinar" de Chrome, puedo ver que el formulario se está procesando correctamente la primera vez:

<ol class="numeric"> <li class="liAll"> <label for="id_alert1_0" class="checkbox inline"> <div class="checker" id="uniform-id_alert1_0"> <span> <input value="1" type="checkbox" class="check" name="alert1" id="id_alert1_0" style="opacity: 0;"> </span> </div> </label> </li> <li class="liAll"> <label for="id_alert1_1" class="checkbox inline"> <div class="checker" id="uniform-id_alert1_1"> <span> <input id="id_alert1_1" type="checkbox" class="check" value="2" name="alert1" style="opacity: 0;"> </span> </div> </label> </li> </ol>

Luego, el mensaje de validación se muestra nuevamente, pero la forma procesada se ve igual:

<ol class="numeric"> <li class="liAll"> <label for="id_alert1_0" class="checkbox inline"> <div class="checker" id="uniform-id_alert1_0"> <span> <input value="1" type="checkbox" class="check" name="alert1" id="id_alert1_0" style="opacity: 0;"> </span> </div> </label> </li> <li class="liAll"> <label for="id_alert1_1" class="checkbox inline"> <div class="checker" id="uniform-id_alert1_1"> <span> <input id="id_alert1_1" type="checkbox" class="check" value="2" name="alert1" style="opacity: 0;"> </span> </div> </label> </li> </ol>

Estoy enviando la publicación con un botón de envío:

<button type="submit" class="btn btn-primary">Send</button>