Package: django-model-urls
# Django Model URLs[![Build Status](https://travis-ci.org/vinyll/django-model-urls.png)](https://travis-ci.org/vinyll/django-model-urls)This app makes urls usage DRYer.It maps URL keywords to a model object instance by passing the objectinstance as argument to the URL.In short, having an `article` model instance, you can write this:```html<a href="{{ url('article:detail', article) }}">View this article</a>```While you have been writing this so far:```html<a href="{{ url('article:detail', year=article.year, month=article.month, slug=article.slug) }}">View this article</a>```This is for your templates as well as for your `reverse()` and preservesother urls to work.> Right now it is build for [Jinja2](http://jinja.pocoo.org/) using theeasy-to-use [Jingo](https://github.com/jbalogh/jingo) adapter.> If you are using plain Django template, refer to version 0.3.1.> A new version for plain Django should come out later on.## InstallationDownload via pip ![pip badge](https://pypip.in/v/django-model-urls/badge.png)```bashpip install django-model-urls```or get the bleeding edge version:```bashpip install git+https://github.com/vinyll/django-model-urls.git```Add _model\_urls_ to your _settings_ file:```pythonINSTALLED_APPS = ('jingo','model_urls',)```And you're done!## How to use itIn the examples below we will consider this model:```pythonclass Article(models.Model):slug = models.SlugField()title = models.CharField(max_length=50)date = models.DateField()@propertydef year(self):return self.date.year@propertydef month(self):return self.date.month```and this urls:```pythonurlpatterns = patterns('',url(r'^article/(?P<year>\d{4})/(?P<month>\d{2})/(?P<slug>[\w-]+)/$',ArticleView.as_view(), name="article_details"),)```and `article` being an instance of the `Article` class.### In a template```pythonurl('article_details', article)```#### In a view```pythonfrom model_urls.urlresolvers import reversereverse('article_details', article)```Both will generate a url in this format:```/2014/11/how-to-optimize-django-urls/```## Extra toolsBasically you should be able to use `url()` and `reverse()` in all cases.However, these tools are also available:#### Template helpers- `url(viewname, *args, **kwargs)` will try to detect an instance in argumentsand choose wheter to use _simple\_url()_ or _model\_url()_ otherwise.- `simple_url(viewname, *args, **kwargs)` is an alias to Jingo's `url()`helper to force using it.- `model_url(viewname, instance, *args, **kwargs)` will generate the url fromthe instance in first argument.#### Url reversingThese functions are available in `model_urls.urlresolvers`.- `model_reverse(viewname, instance, urlconf=None, args=None, kwargs=None,prefix=None, current_app=None)` will generate the url based on the instanceproperties.- `reverse(viewname, *args, **kwargs)` will fallback to _model\_reverse()_ ifan instance is found in arguments or to Django's _reverse()_ otherwise.## ConfigurationAn optional configuration is for your settings is:```pythonMODEL_URLS_HELPER_OVERRIDE = False```This option will not allow the Jingo's `url()` helper to be overriden by theone from model_urls.In this case you should use `model_url()` to use an instance.### Further examples#### Use casesA common use case is switching from pk based url to slug.Using django-model-urls means updating the _urls.py_ file to consider slugwithout altering views or template files.#### Read testsRefer to [tests.py](https://github.com/vinyll/django-model-urls/blob/master/model_urls/tests/)to see more usages.