Question

What really is the true meaning of django project and individual apps in it?

I mean - AFAIK you cannot create a project and live entirely in that project you created, you have to create an app in that project to be able to actually do something in django. Please correct me if I'm wrong.

Now what should really be the structure of a django project? I'm writing an e-shop. Let's say my project is named foo:

/foo
    /foo
        /settings.py
        /templates
        /urls.py
        /wsgi.py
    /shop
        /__init__.py
        /admin.py
        /models.py
        /tests.py
        /views.py

and do everything entirely in /foo/shop/, but I edit urls.py inside /foo/foo/ etc.

I was following the Django Book, but I've begun to gain that strange feeling that /foo/foo/ is just for a main folder "stitching the thing together" but individual stuff should be done only in /foo/shop/, but not limited to. Preferably in /foo/web/, /foo/products/, /foo/forum/, /foo/controlpanel/, /foo/shop/, /foo/helpdesk/, /foo/backoffice/ etc.

Is that correct? Should I put everything products-related in /foo/products/, that including storage management, shipping, dealers, prices etc., then put management of those products (from the employee side) to /foo/backoffice/, which will serve as some sort of "django.contrib.admin" for this? Is that correct? Then if I want to host multiple instances of this (with completely separate databases and stuff) for multiple customers, should i only create a barebone project, that will put these things together, to configure the settings and then just move individual components in some sort of central repository and call them back in the project via INSTALLED_APPS? Because that would be cool as hell! I mean - making all the changes globally, not touching users data and configuration, unless necessary (adding columns in models and such). Is this how django is really supposed to be used? Or am I completely off the track and do things ENTIRELY wrong and this paragraph just doesn't make any django-sense?

I'm relatively new to this. I've been using PHP before and even though Django was a pain-in-the-ass to get basic grip of, I don't regret that and plan to deprecate and make offline any PHP project I created to date and replace them all with django. Well - where it makes sense and is not a single-purpose site. Not only because Django is awesome and versatile, but i cas I can scale it easily as well…

So… How should I really design Django projects, apps, and how to use them in production, providing them to multiple customers?

Thank you!

Was it helpful?

Solution

I mean - AFAIK you cannot create a project and live entirely in that project you created, you have to create an app in that project to be able to actually do something in django. Please correct me if I'm wrong.

You can do plenty of things on just a project, but you need an app for models to be auto discovered.

For example, I have a project with just this in urls.py:

class Homepage(generic.TemplateView):
    template_name = 'homepage.html'

    def get_context_data(self):
        context = cache.get('homepage')

        if not context:
            management.call_command('reset_cache')
            context = cache.get('homepage')

        return context


urlpatterns = patterns("",
    url(r"^$", Homepage.as_view(), name="home"),
)

You guessed it, it's a really basic website.

and do everything entirely in /foo/shop/, but I edit urls.py inside /foo/foo/ etc.

I was following the Django Book, but I've begun to gain that strange feeling that /foo/foo/ is just for a main folder "stitching the thing together" but individual stuff should be done only in /foo/shop/, but not limited to. Preferably in /foo/web/, /foo/products/, /foo/forum/, /foo/controlpanel/, /foo/shop/, /foo/helpdesk/, /foo/backoffice/ etc.

Well, you should define /foo/shop/urls.py, and import it from /foo/foo/urls.py ie.:

urlpatterns = patterns("",
    url(r"^shop/", include("shop.urls")),
)

The point is to make your apps more convenient to reuse in other django projects.

Is that correct? Should I put everything products-related in /foo/products/, that including storage management, shipping, dealers, prices etc., then put management of those products (from the employee side) to /foo/backoffice/, which will serve as some sort of "django.contrib.admin" for this? Is that correct?

You should take a look at open source projects and see how they divided that.

According to the directory tree that you represented, you seem to have understood the point, but your statement seems fuzzy so I'll attempt to clarify it.

Apps are generally oriented around models. So if I make a product app it will probably contain:

  • Product model,
  • Product list, edit, create, delete and detail view
  • urls for the views,
  • Product admin,
  • tests for Product and views,
  • other things which are used by other django apps like product/admin.py would be used by django.contrib.admin, but also external apps like django-autocomplete-light would use product/autcomplete_light_registry.py and django-rules-light would use product/rules_light_registry

Then if I want to host multiple instances of this (with completely separate databases and stuff) for multiple customers, should i only create a barebone project, that will put these things together, to configure the settings and then just move individual components in some sort of central repository and call them back in the project via INSTALLED_APPS?

There are many ways to do SaaS with django. But I agree that the easiest and most convenient is to maintain generic apps and build a project per customer that reuses (and eventually override parts of) these apps.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top