i’m looking for a way to extend a django template/view.
my first implementation consists of two models (clients/models.py):
class Client(models.Model):
...
class Address(models.Model):
client = models.ForeignKey(Client)
...
and its fairly simple template (clients/detail.html) :
{{client.name}}
Address: {{client.address.street}}, {{client.address.zipcode}} {{client.address.city}}
as my application grows, a new app was born: ‘invoices’.
it is again very simple (invoices/models.py):
class Invoice(models.Model):
client = models.ForeignKey(clients.models.Client)
...
now my clients details-view needs to display invoices, so i create and override clients/detail.html in my ‘invoices’ app.
good for now.
later on i created a third app ‘quotes’.
again my clients details-view needs to display quotes.
if i create clients/detail.html in my ‘clients’ i will loose the ability to display invoices.
because the ‘invoices’ and ‘quotes’ app are indipendent.
my first idea was to create something like a SubView-class
which ‘invoices’ and ‘quotes’ can extend and then register their implementation somewhere.
a template should look like this:
{{client.name}}
Address: {{client.address.street}}, {{client.address.zipcode}} {{client.address.city}}
{% for view in views %}
<h1>{{view.title}}</h1>
{{view.get_html}}
{% endfor %}
is this a good way to go and should i use a admin.site-like implementation for registering my sub-views?
In Django one
urlinurls.pyshould ideally use oneview, just to keep things simple.I would therefore adopt the approach of putting all the required context in your one view for this screen (I think you already have this via foreign keys in your model). Then, rather than doing what you call “SubView-class” I would go for the Django template include tag.
Example:
This renders each invoice’s detail for all the invoices of the
client. Notice how this is in line with the DRY principle.