I've done something similar for auto-generated forms (form_for_model()
and form_for_instance()), by derivating a class from BaseForm and
providing my own _html_output() method, which emits the label with
different attributes depending on its "requiredness" (using the
'attrs' parameter to BoundField.label_tag()).
Then pass your derived class to form_for_model() and
form_for_instance() using the form named parameter.

The code:

class ExtForm(forms.BaseForm):
    def _html_output(self, normal_row, error_row, row_ender,
help_text_html, errors_on_separate_row):
        "Helper function for outputting HTML. Used by as_table(),
as_ul(), as_p()."
        from django.newforms.forms import BoundField
        from django.newforms.fields import Field
        from django.newforms.util import flatatt, ErrorDict,
ErrorList, ValidationError
        from django.utils.html import escape
        from django.utils.encoding import StrAndUnicode,
smart_unicode, force_unicode
        top_errors = self.non_field_errors() # Errors that should be
displayed above all fields.
        output, hidden_fields = [], []
        for name, field in self.fields.items():
            bf = BoundField(self, field, name)
            bf_errors = self.error_class([escape(error) for error in
bf.errors]) # Escape and cache in local variable.
            if bf.is_hidden:
                if bf_errors:
                    top_errors.extend(['(Hidden field %s) %s' % (name,
force_unicode(e)) for e in bf_errors])
                hidden_fields.append(unicode(bf))
            else:
                if errors_on_separate_row and bf_errors:
                    output.append(error_row %
force_unicode(bf_errors))
                if bf.label:
                    label = escape(force_unicode(bf.label))
                    # Only add the suffix if the label does not end in
punctuation.
                    if self.label_suffix:
                        if label[-1] not in ':?.!':
                            label += self.label_suffix
                    if field.required:
                        label = bf.label_tag(label, attrs={'class':
'required'}) or ''
                    else:
                        label = bf.label_tag(label, attrs={'class':
'optional'}) or ''
                else:
                    label = ''
                if field.help_text:
                    help_text = help_text_html %
force_unicode(field.help_text)
                else:
                    help_text = u''
                output.append(normal_row % {'errors':
force_unicode(bf_errors), 'label': force_unicode(label), 'field':
unicode(bf), 'help_text': help_text})
        if top_errors:
            output.insert(0, error_row % top_errors)
        if hidden_fields: # Insert any hidden fields in the last row.
            str_hidden = u''.join(hidden_fields)
            if output:
                last_row = output[-1]
                # Chop off the trailing row_ender (e.g. '</td></tr>')
and insert the hidden fields.
                output[-1] = last_row[:-len(row_ender)] + str_hidden +
row_ender
            else: # If there aren't any rows in the output, just
append the hidden fields.
                output.append(str_hidden)
        return u'\n'.join(output)

Hope this helps.
Cheers,
Marco


On Oct 22, 8:33 pm, [EMAIL PROTECTED] wrote:
> I see what you mean but I dont think it will work because I want the
> field elements to look sort of like:
>
> [Prompt:] [Textbox] [a red '*' initially or a error message after
> validation] [help text if any]
>
> So, in the template, I was hoping to be able do something like:
>
> <b>{{field.label_tag}}:</b> {{field}}
> {% if field.error%}
>     <font color="red"><b>{{ field.error }}</b></font>
> {% else %}
>    {% if field.required %} <font color="red">*</font>{% endif %}
> {% endif %}
> {% if field.help_text %}}  <font
> color="silver">{{ field.help_text }}</font>{% endif %}
>
> Not sure if I have all the code correct here but you get the idea...
>
> Thanks to everyone in the Django community!
> Carlos :)


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to