Wednesday, October 22, 2014

Re: Import error in settings.py

Just thought you might get a kick out of the fact that I just found this very useful – 4 years later. Thanks.

On Tuesday, February 12, 2008 7:27:45 PM UTC-8, Julien wrote:
Great! Thanks a lot, it worked!

Here's a little function that I made and that is quite helpful:

def get_class(class_path):
    i = class_path.rfind('.')
    module_path, class_name = class_path[:i], class_path[i+1:]
    module = __import__(module_path, globals(), locals(),
[class_name])
    return getattr(module, class_name)

Thanks again for your help. That wasn't easy, but that made me visit
some parts of Python and Django that I didn't know about. And it does
demystify a lot of things!

On Feb 13, 1:40 pm, Malcolm Tredinnick <malc...@pointy-stick.com>
wrote:
> On Tue, 2008-02-12 at 18:30 -0800, Julien wrote:
> > Hello,
>
> > The module was not compiled, because it was the __import__ function
> > itself that raised an exception and so didn't have the chance to do
> > the compilation.
>
> > As you've suggested, I tried:
>
> > klass = __import__("myapp", {}, {}, [''])
> > -> Works, returns <module myapp>
>
> > klass = __import__("myapp.forms", {}, {}, [''])
> > -> Works, returns <module myapp.forms>, and compiles "forms.pyc"!!
>
> > klass = __import__("myapp.forms", {}, {}, ['MyModelForm'])
> > -> Works, and returns the same thing as above: <module myapp.forms>
>
> > But, although the module is now compiled, the following still doesn't
> > work:
> > klass = __import__("myapp.forms.MyModelForm", {}, {}, [''])
>
> > For info, MyModelForm is an instance of ModelFormMetaclass. I also
> > tried importing another model, still in vain:
> > klass = __import__("myapp.models.MyOtherModel", {}, {}, [''])
>
> Oh, doh! I'm an idiot. The answer was there all along.
>
> You can't do "import myapp.models.MyOtherModel", because MyOtherModel
> isn't a *module*. It's something inside a module. That's just normal
> Python behaviour.
>
> So you have to do
>
>         module = __import__("myapp.forms", {}, {}, ['MyModelForm'])
>
> (using either 'MyModelForm' or '' in the last component). Then
>
>         klass = module.MyModelForm
>
> Of course, in your case, that means splitting off the last dotted piece
> of the string to work out the form class. This is exactly what we do in
> django.template.loader.find_template_source(), for example, to separate
> the template loader function from the model it's contained in.
>
> I'm so sorry for misleading you for a little while there. Complete brain
> failure on my part. But it all makes perfect sense now.
>
> Regards,
> Malcolm
>
> --
> Depression is merely anger without enthusiasm.http://www.pointy-stick.com/blog/

--
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+unsubscribe@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/f637d7c0-65ad-4eac-bc33-b6efe2ef5c6e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment