Hello, i don't know if it's a django or python problem. But i correct a
strange bug and would know why my code was bugging and if it was django,
python, or me. The situation (and solution) is exposed
here<http://stackoverflow.com/questions/19818685/django-cache-make-some-mistake-with-formset-generated-class>but
i reproduce it here:
I've two page, each of one display a form and a formset. They have same
code logic:
*views*
> from django.forms.models import inlineformset_factoryfrom
> djStock.stock.models import MyAModelfrom djStock.stock.forms.MyAModelForm
> import MyAModelFormfrom djStock.stock.models import MyBModelfrom
> djStock.stock.forms.MyBModelForm import MyBModelForm
> def a_create(request):
>
> form = MyAModelForm()
> formset_factory = inlineformset_factory(MyAModel, MyAModel.things.through)
> formset = formset_factory()
> [...]
> def b_create(request):
>
> form = MyBModelForm()
> formset_factory = inlineformset_factory(MyBModel, MyBModel.things.through)
> formset = formset_factory()
> [...]
>
> (With this code, all work fine) So i made refactoring and write some class
(i removed unecessary code for exemple):
*ModelFormsetManager*
> from django.forms.models import inlineformset_factory
> class ModelFormsetManager(object):
>
> form = None
> formsets = {}
>
> def initialize_formset(self, name, entity, related_entity):
> self.formsets[name] = inlineformset_factory(entity, related_entity)
>
> # for debug at the end of question
> print self.formsets[name]
>
> def __init__(self, request, form_class):
> if request.method == 'POST':
> [...]
> else:
> self.form = form_class()
> for formset_name, formset in self.formsets.iteritems():
>
> # for debug at the end of question
> print formset
>
> self.formsets[formset_name] = formset()
>
> *
*
*MyAModelManager*
> from ..models import MyAModelfrom ..forms.MyAModelForm import
> MyAModelFormfrom djStock.stock.managers.ModelFormsetManager import
> ModelFormsetManager
> class MyAModelManager(ModelFormsetManager):
>
> def __init__(self, request):
> self.initialize_formset('things', MyAModel, MyAModel.things.through)
> super(MyAModelManager, self).__init__(request, MyAModelForm)
>
> *MyBModelManager*
> from ..models import MyBModelfrom ..forms.MyBModelForm import
> MyBModelFormfrom djStock.stock.managers.ModelFormsetManager import
> ModelFormsetManager
> class MyBModelManager(ModelFormsetManager):
>
> def __init__(self, request):
> self.initialize_formset('things', MyBModel, MyBModel.references.through
> super(MyBModelManager, self).__init__(request, MyBModelForm)
>
>
With this refactoring my views look like:
> def a_create(request):
> a_manager = MyAModelManager(request=request)
> [...]
> def b_create(request):
> b_manager = MyBModelManager(request=request)
> [...]
>
>
Okay, now the strange bug (keep in mind one thing: actions order is
important):
- When i load *a_create* view, all is displayed correctly (reloading
page to).
Prints displays that:
> <class 'django.forms.formsets.MyAModelThingFormFormSet'><class
> 'django.forms.formsets.MyAModelThingFormFormSet'>
>
>
- I load *b_create* view, an error raised.
Prints displays that:
> <class 'django.forms.formsets.MyBModelThingFormFormSet'><class
> 'django.forms.formsets.MyBModelThingFormFormSet'>
>
>
And error is:
> File
> "/home/bux/.python/envs/djStock/local/lib/python2.7/site-packages/django/core/handlers/base.py",
> line 115, in get_response
> response = callback(request, *callback_args, **callback_kwargs)
> File "/home/bux/Private/projets/djStock/stock/views/b.py", line 28, in
> b_create
> b_manager = MyBModelManager(request=request)
> File
> "/home/bux/Private/projets/djStock/../djStock/stock/managers/MyBModelManager.py",
> line 9, in __init__
> super(MyBModelManager, self).__init__(request, MyBModelForm)
> File
> "/home/bux/Private/projets/djStock/../djStock/stock/managers/ModelFormsetManager.py",
> line 31, in __init__
> self.formsets[formset_name] = formset()TypeError:
> 'MyAModelThingFormFormSet' object is not callable
>
> *Important note*: At "formset()" django is trying to call My
> *A*ModelThingFormFormSet whereas My
*B* ModelThingFormFormSet (print confirm it showing
MyBModelThingFormFormSet). That's one of strange point.
-
If i reload *b_create* view, same error. If i reload *a_create* view
it's always working.
-
I turn off *python manage.py runserver |...]* and run it again
-
I load *b_create* view (previously rasing error), now it's *working*.
Prints displays that:
> <class 'django.forms.formsets.MyBModelThingFormFormSet'><class
> 'django.forms.formsets.MyBModelThingFormFormSet'>
>
>
- I load *a_create* view (previously working), now it is *not* working.
Prints displays that:
> <class 'django.forms.formsets.MyAModelThingFormFormSet'><class
> 'django.forms.formsets.MyAModelThingFormFormSet'>
>
> And error is:
> Traceback (most recent call last):
> File
> "/home/bux/.python/envs/djStock/local/lib/python2.7/site-packages/django/core/handlers/base.py",
> line 115, in get_response
> response = callback(request, *callback_args, **callback_kwargs)
> File "/home/bux/Private/projets/djStock/stock/views/stock.py", line 37, in
> a_create
> a_manager = MyAModelManager(request=request, form_initial=form_initial)
> File
> "/home/bux/Private/projets/djStock/../djStock/stock/managers/MyAModelManager.py",
> line 10, in __init__
> super(MyAModelManager, self).__init__(request, MyAModelForm,
> form_initial=form_initial)
> File
> "/home/bux/Private/projets/djStock/../djStock/stock/managers/ModelFormsetManager.py",
> line 31, in __init__
> self.formsets[formset_name] = formset()TypeError:
> 'MyBModelThingFormFormSet' object is not callable
>
> *We note again*: the "not callable object" is related to the previous
view! Not to current view.
So, to solve the problem i've change *ModelFormsetManager* to:
>
> from django.forms.models import inlineformset_factory
> class ModelFormsetManager(object):
>
> form = None
> formsets = {}
> formsets_factorys = {}
>
> def initialize_formset(self, name, entity, related_entity):
> self.formsets_factorys[name] = inlineformset_factory(entity,
> related_entity)
>
> # for debug at the end of question
> print self.formsets[name]
>
> def __init__(self, request, form_class):
> if request.method == 'POST':
> [...]
> else:
> self.form = form_class()
> for formset_name, formset in self.formsets_factorys.iteritems():
>
> # for debug at the end of question
> print formset
>
> self.formsets[formset_name] = formset()
>
> So i use different attribute to stock return of
> *inlineformset_factory*(formsets_factorys) and result of
*formset()* (formsets). Know, i'm *very*, *very* curious to know why
python/django mistake between to view.
Have a nice day!
*Ps: English not my native language*
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/d47b5704-c295-4848-a7ee-5a9c0d6b04a1%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.