.. _django-example:
Django example
==============
.. meta::
   :keywords: Python,Dependency Injection,Django,Example
   :description: This example demonstrates a usage of the Django and Dependency Injector.
This example shows how to use ``Dependency Injector`` with `Django `_.
The example application helps to search for repositories on the Github.
.. image:: images/django.png
    :width: 100%
    :align: center
The source code is available on the `Github `_.
Application structure
---------------------
Application has standard Django project structure. It consists of ``githubnavigator`` project package and
``web`` application package:
.. code-block:: bash
   ./
   ├── githubnavigator/
   │   ├── __init__.py
   │   ├── asgi.py
   │   ├── containers.py
   │   ├── services.py
   │   ├── settings.py
   │   ├── urls.py
   │   └── wsgi.py
   ├── web/
   │   ├── templates/
   │   │   ├── base.html
   │   │   └── index.html
   │   ├── __init__.py
   │   ├── apps.py
   │   ├── tests.py
   │   ├── urls.py
   │   └── views.py
   ├── manage.py
   └── requirements.txt
Container
---------
Declarative container is defined in ``githubnavigator/containers.py``:
.. literalinclude:: ../../examples/miniapps/django/githubnavigator/containers.py
   :language: python
Container instance is created in ``githubnavigator/__init__.py``:
.. literalinclude:: ../../examples/miniapps/django/githubnavigator/__init__.py
   :language: python
Views
-----
View has dependencies on search service and some config options. The dependencies are injected
using :ref:`wiring` feature.
Listing of ``web/views.py``:
.. literalinclude:: ../../examples/miniapps/django/web/views.py
   :language: python
App config
----------
Container is wired to the ``views`` module in the app config ``web/apps.py``:
.. literalinclude:: ../../examples/miniapps/django/web/apps.py
   :language: python
   :emphasize-lines: 13
Tests
-----
Tests use :ref:`provider-overriding` feature to replace github client with a mock ``web/tests.py``:
.. literalinclude:: ../../examples/miniapps/django/web/tests.py
   :language: python
   :emphasize-lines: 39,60
Sources
-------
Explore the sources on the `Github `_.
.. disqus::