Question: My site has few global configurations. For example "smtp-server address", "company address", etc.

Of course I can:

1. Create variables in `settings.py` and use it in templates and apps;
2. Create a model (like `Configuration`) and write all needed fields there.

If I use the first way I can't give access for changing these fields in django-admin.

If I use the seconds way it is not a beautiful solution, because everywhere in the code I have to use `model_name.objects.get(id=1)` and I need only one instance. Models were created for other tasks.

How can I solve this problem?

Answer: 
This is what I did. Might not be the most optimal solution but works for me.

1. Create a Configuration model and do all the usual stuff as in your point 2. Create a function (say in `configuration.view`) which will pull out and return the configuration values in a dict.
2. Now in your `settings.py`, import your function and set the returned dict to a `settings.py` variable:
`CONFIG = configuration.view.get_config()`
3. Create a template context processor which will set this `CONFIG` dict in the template context.

```
def init_site_settings(request):
    return settings.CONFIG

```
4. Add this context processor to your `TEMPLATE_CONTEXT_PROCESSORS`
5. Now you are free to use your configuration parameters in templates as `{{my_config_key}}`

Hope this helps.
Have a look at <http://www.djangopackages.com/grids/g/live-setting/>
from my similar question [Changing Django settings at runtime](https://stackoverflow.com/questions/6528723/changing-django-settings-at-runtime)

Regarding the id=1 notation, a) you can define a corresponding attribute on your manager <https://docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methods>
b) yes that's still a database query - checkout <https://github.com/disqus/django-modeldict/> for an approach with lazy access and caching.