Form Code getting executed during django project startup

23 views
Skip to first unread message

Web Architect

unread,
Oct 12, 2018, 3:52:31 AM10/12/18
to Django users
Hi,

We are using Django for our ecommerce site. 

I have some confusion on when the code gets executed in Django. I have a django form with a choice field in module m1.py:

class SomeForm(forms.Form):
    field = forms.ChoiceField(choices=get_choices())


def get_choices():
    return some choices


In views.py, I have imported SomeForm:

from app.m1 import SomeForm

class SomeFormView(Formview):
    form = SomeForm
    ...rest of the view code


When I run the django project using ./manage.py runserver, I am surprised to see that get_choices gets executed. This is undesirable as I can have a Django queryset in get_choices and I do not want unnecessary DB access. 

It would be really helpful if someone can shed some light on the above and tell me what exactly is happening. How can I avoid get_choices getting executed during django start  or running? get_choices should only get executed when SomeFormView is accessed.

Thanks.

Michal Petrucha

unread,
Oct 12, 2018, 4:09:38 AM10/12/18
to Django users
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

On Fri, Oct 12, 2018 at 12:52:31AM -0700, Web Architect wrote:
> Hi,
>
> We are using Django for our ecommerce site.
>
> I have some confusion on when the code gets executed in Django. I have a
> django form with a choice field in module m1.py:
>
> class SomeForm(forms.Form):
> field = forms.ChoiceField(choices=get_choices())

The problem is here – you're calling get_choices, and passing the
result to the ChoiceField as a static list. If you pass get_choices as
a function, it will be called at runtime, whenever the form is
instantiated:

class SomeForm(forms.Form):
field = forms.ChoiceField(choices=get_choices)

Good luck,

Michal

>
>
> def get_choices():
> return some choices
>
>
> In views.py, I have imported SomeForm:
>
> from app.m1 import SomeForm
>
> class SomeFormView(Formview):
> form = SomeForm
> ...rest of the view code
>
>
> When I run the django project using ./manage.py runserver, I am surprised
> to see that get_choices gets executed. This is undesirable as I can have a
> Django queryset in get_choices and I do not want unnecessary DB access.
>
> It would be really helpful if someone can shed some light on the above and
> tell me what exactly is happening. How can I avoid get_choices getting
> executed during django start or running? get_choices should only get
> executed when SomeFormView is accessed.
>
> Thanks.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBCgAGBQJbwFaVAAoJEHA7T/IPM/klm44QAJMjeGXjs7fzHaCpi7Sn16Ib
bHAyoluqmS5+Pw9yYsg3FaYJwx1JC6r/vB6Hv9WfBAI5cIzJa+k0e8T7PkuUg3Nc
ioG4izJWYC8F4MSXXynRVrt8UR4OfQrDw2tmXPXI++nf9GgMmN1Q/VJwVyWKUK8h
MD6L8ap0IIhhjOr3Nwvc1lsT68Hx4eEBmPcGa88FsHMUpox6ktIYmIeCq9WDIVQz
GKxMdRr+SUjcq7NeqqLL1davlL2YIKAaSdy1tNaxQ890u436MUkQ0L5FK2FtpKIh
ViqraEi/BaHWzZ6Dr6l6oG5QlrIHiG89VjYvYYo6qAtB67Yl5A6QnLY1YkMpiNkv
jZJt+u3ad4+qP5JQ0/SDYruyN2cjt6SVowQmAAxyGYbzFYMhWEz/NDopPXB/8q01
nr7o+N4azH696Ryr9bH5KEilrZvoxxxt9Zb+IGaJU5tfHs4A2Pzmw6aNmwMkRAVg
Mo0eaQuOu4zG6ix5X2wX7z+2MrGfBw0OJisOH3BzPOQ9CdHOaB0HuaveKQ39aVCL
vmGgPy+NnBr+EL/r1PC+sD9JjSFM6sD8+7fB1rvEtYsILj+DHHICYOZGaBGU34zm
TJjCHDSTp5Dx/p5mrt8Y9UJLf5U7C2Sz562R2ez3wKkrCqxGKN7fY7cq0oB01Cph
geJsa6+RNjRHpCbM1U/U
=7eA9
-----END PGP SIGNATURE-----

Web Architect

unread,
Oct 12, 2018, 5:19:56 AM10/12/18
to Django users
Hi Michal,

Thanks a lot. That was an eye-opener and a big help :)

Thanks.
Reply all
Reply to author
Forward
0 new messages