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 django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
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.

Reply via email to