开发者

Editing Django _form.as_p

By default _form.as._p spits out:

<p><label for="id_subject">Subject:</label>
    <input id="id_subject" typ开发者_如何转开发e="text" name="subject" maxlength="100" /></p>

Whereas I need

 <p><label for="id_subject">Subject:</label><p>
    <input id="id_subject" type="text" name="subject" maxlength="100" /></p>

with a break between the label and the input. How can I modify my Django code to do so?


You simply just can't use form.as_p anymore. If the defaults don't work for you, then you must render the fields manually:

<form action="/contact/" method="post">
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
        </div>
    {% endfor %}
    <p><input type="submit" value="Send message" /></p>
</form>

See the docs: https://docs.djangoproject.com/en/dev/topics/forms/#looping-over-the-form-s-fields


If you just need a break, then there's no need to change the Django code. Just use CSS to style label as display: block.


Override as_p on your form class.

class MyForm(forms.Form):
    def as_p(self):
        "Returns this form rendered as HTML <p>s."
        return self._html_output(
            normal_row = u'<p%(html_class_attr)s>%(label)s</p> %(field)s%(help_text)s',
            error_row = u'%s',
            row_ender = '</p>',
            help_text_html = u' <span class="helptext">%s</span>',
            errors_on_separate_row = True)


Pretty much what Brian describes above. I would write a new method for your form like as_myp. I made this for myself. I took as_table method and made as_plain to remove the tr/th markups. Ex.

class MyForm(forms.Form):
    my_field1 = forms.CharField(...)
    my_field2 = forms.WhateverField(...)

    def as_myp(self):
        "Returns this form rendered as HTML <p>s."
        return self._html_output(
            normal_row = '<p%(html_class_attr)s>%(label)s</p> <p>%(field)s%(help_text)s</p>',
            error_row = '%s',
            row_ender = '</p>',
            help_text_html = ' <span class="helptext">%s</span>',
            errors_on_separate_row = True)

    def as_plain(self):
        "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
        return self._html_output(
            normal_row = '%(label)s%(errors)s%(field)s%(help_text)s',
            error_row = '%s',
            row_ender = ' ',
            help_text_html = '<br /><span class="helptext">%s</span>',
            errors_on_separate_row = False)

It just seemed easier to do that than write a template file and handle form field rendering with errors, tags, visible/hidden, etc.


Template:

<div id="my_form">
    {{ form.as_p }}
</div>

CSS:

#my_form p label,
#my_form p input{
    float: left;
    clear: left;
}

So if you add fields you can still use form.as_p

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜