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>