205

This is a very beginner question. But I'm stumped. How do I reference a Django settings variable in my model.py?

NameError: name 'PRIVATE_DIR' is not defined

Also tried a lot of other stuff including settings.PRIVATE_DIR

settings.py:

PRIVATE_DIR = '/home/me/django_projects/myproject/storage_dir'

models.py:

# Problem is here.
from django.core.files.storage import FileSystemStorage

fs = FileSystemStorage(location=PRIVATE_DIR)

class Customer(models.Model): 
    lastName = models.CharField(max_length=20) 
    firstName = models.CharField(max_length=20) 
    image = models.ImageField(storage=fs, upload_to='photos', blank=True, null=True)

What's the correct way to do this?

1

3 Answers 3

462

Try with this: from django.conf import settings then settings.VARIABLE to access that variable.

VARIABLE should be in capital letter. It will not work otherwise.

Sign up to request clarification or add additional context in comments.

2 Comments

Something relevant: if you have several instances of settings_something.py due to a project deployed in several environments, do not try to import from app.settings. Overwritten variables in the other files won't take effect. Always use the import mentioned in this answer. It took me a few hours to realize what was going on in my project.
This works, if it is properly configured: with environment variable DJANGO_SETTINGS_MODULE or with manage.py command line parameter --settings=.. Read more in docs: docs.djangoproject.com/en/2.0/topics/settings
141
from django.conf import settings

PRIVATE_DIR = getattr(settings, "PRIVATE_DIR", None)

Where it says None, you will put a default value incase the variable isn't defined in settings.

Comments

6

There's an example of importing the EMAIL_HOST_USER from the settings.py file and use it to send an email:

from django.conf import settings
from django.core.mail import send_mail

def post_share(request, post_id): 
   # ...
   send_mail(subject, message, settings.EMAIL_HOST_USER, [
                      settings.EMAIL_HOST_USER, '[email protected]'])

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.