Opened 11 years ago

Closed 11 years ago

Last modified 11 years ago

#20703 closed Uncategorized (invalid)

Why django form.as_p call form.clean method when template renders?

Reported by: max.kharandziuk@… Owned by: nobody
Component: Template system Version: 1.5
Severity: Normal Keywords: as_p clean templates
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

I have this sample of django code:


# views.py
    def test_view(request):
        form = TestForm(
            request.POST or { 'text': 'some text'},
        )
        data = {
            'form': form,
        }
        print 'before rendering'
        return render(request, 'test.html', data)
    
    # forms.py
    class TestForm(forms.Form):
        text = forms.CharField()
    
        def __init__(self, *args, **kwargs):
            print 'init'
            super(TestForm, self).__init__(*args, **kwargs)
    
        def clean(self):
            print 'in clean'

and this template:

    #test.html
    <form id='test-form' method="post" action="some url" enctype="multipart/form-data">
        {{ form.as_p }}
        <input type="submit" value="Save"/>
    </form>

when i send get request to this file i have this output in console:

before rendering
init
in clean

when I write {{ form.text }} instead of {{ form.as_p }} I have only:

before rendering
init

It seams to me that as_p method calls clean() internally in process of rendering template.
Is it a bug or some undocumented feature?
Should this side effect avoided?

Version of Django==1.5.1

Change History (3)

comment:1 by Tim Graham, 11 years ago

Resolution: invalid
Status: newclosed

I think you want to use initial={'text': 'some text'} when initializing TestForm rather than request.POST or {'text': 'some text'}, but this ticket tracker isn't the place to get help with this, thanks!

https://code.djangoproject.com/wiki/TicketClosingReasons/UseSupportChannels

comment:2 by max.kharandziuk@…, 11 years ago

I don`t ask a help with this code I just mentioned that as_p method has some side effect(calls clean()) that not described in documentation. Maybe this effect is a bug

comment:3 by Tim Graham, 11 years ago

as_p will output error rows (if any) as well as non-field errors. Naturally, this requires calling clean. Since you are passing data to the form on GET, the form is validated and clean is called.

Note: See TracTickets for help on using tickets.
Back to Top