Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
Python and Tcl - public course schedule [here]
Private courses on your site - see [here]
Please ask about maintenance training for Perl, PHP, Lua, etc
Django - separating the HTML from the view / model

This is the third section on Django - the Python based web framework. See first Step 1 and Step 2.

Let's add another view of our data to our Django app - using DRY techniques, this will be a short piece of coding but I'll take the opportunity to add in and explain a few more features that you'll probably find yourself using:


No change - we're working with the same data structure!

URL Mapping

The last line in url.py has been added:

  (r'^hosts/$', 'nets.views.index'),
  (r'^hosts/index\.htm', 'nets.views.index'),

That's a new view, with an added URL which does not include ".htm" or ".html" on the end. Opinions vary as to whether you should (or should not) add .html ... and I've chosen for this example to use the variant we hadn't previously used to provide an extra URL. We've added a new view ...

[complete source - urls.py]

The view

  def integral(request,system_id):
    syl = System.objects.all()
    if (system_id == 'index'):
      t = [('home','http://www.wellho.net'),('hostindex','index')]
      t = [('home','http://www.wellho.net'),('hostindex','index'),(system_id,system_id)]
    fill = Context({'sylist':syl, 'year' : year,
      'expand' : system_id, 'trail': t,
      'entitled':'Integrated page using template code'})
    return render_to_response('nets/integrate.html',fill)

The really important thing here is that we have removed ALL of the html from this code, and in now purely translates the information held in the model into values that we're going to make use of in our template to view the the data - that's where the HTML should rightfully be!

In order to remove the HTML, we have structured the data that we need to pass to the template for formatting into lists and tuples in the context. And it's such a frequent requirement to read, complete and return a template that we've used a shortcut called render_to_response to do the work in a single step. For that to work, we need to pull in a new include file:
  from django.shortcuts import render_to_response.

[complete source - view.py]

The Template

We've retained elements such as
  <a href=http://www.wellho.net/course/python.html>see here</a><br />
    Copyright &copy; {{year}}, Well House Consultants

which are just dropping values into the page, but we have taken away all elements of the form
  <div class=trail>{{trail|safe}}</div>
exactly because they were not safe (or at least they weren't wise) - these are the elements which include various bits of HTML which we generated within out Python, rather than keeping them purely at the template level.

Let's see how we handled that trail. Previously we passed in some HTML like:
  'home -> <a href=index.html>hostindex</a> -> '+system_id,
but now we're going to pass in a Python structure:

And in the template, we'll replace our simple variable place holder with the following code:
  {% for element in trail %}
    &nbsp;<a href={{element.1}}>{{element.0}}</a>
  {% endfor %}

Which places the HTML firmly (and only) in the template.

We'll do something similar with the list of systems, and add into there the ability to highlight an item so that we can use a single template for the listing, and also for individual pages - and that will bring in progamming-style tags like if and while.

  {% for h in sylist %}
  {% if h.name == expand %}
    <br /><center><table border=3 cellpadding=10 width=80% bgcolor=#FFCCAA><tr><td>
    <li>{{h.name}} at {{h.ip}}</li>
    Status: {{h.about}}
    </td></tr></table></center><br />
  {% else %}
    <li><a href={{h.name}}>{{h.name}}</a> at {{h.ip}}</li>
  {% endif %}
  {% endfor %}

It's "Dry" - it's non-repeating. The changes are distributed over the three files - the template, the view.py and the urls.py (and they could bring changes to the model too), but each change is made only once. And we've now got excellent separation from the look and feel, represented by the template, and the model, with the view in between providing the manipulation code for the data.

[complete source - template.html]

Let's see some sample output:

Final Django example - screen shot

Final Django example - screen shot

Final Django example - screen shot
(written 2011-01-20, updated 2011-01-21)

Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Y306 - Python - The Django web framework
  [4095] Django - first steps - Updated - (2013-05-19)
  [4013] Web Frameworks - nested templates - (2013-02-22)
  [3919] What is a web framework? - (2012-11-10)
  [3705] Django Training Courses - UK - (2012-04-23)
  [3698] How to stop forms on other sites submitting to your scripts - (2012-04-15)
  [3640] Sessions (Shopping Carts) in Django - the Python Web Framework - (2012-03-05)
  [3639] Demonstration of a form using Django - (2012-03-04)
  [3634] Defining database relations in your Django model - (2012-03-02)
  [3633] Nesting Templates in Django - (2012-03-02)
  [3624] Why do we need a Model, View, Controller architecture? - (2012-02-25)
  [3139] Steering our Python courses towards wxPython, SQLite and Django - (2011-01-19)
  [3138] Django - adding your own views, and then templating your views. - (2011-01-18)
  [3136] A framework with python - Django - first steps - (2011-01-17)
  [1745] Moodle, Drupal, Django (and Rails) - (2008-08-08)

Back to
Steering our Python courses towards wxPython, SQLite and Django
Previous and next
Horse's mouth home
Forward to
Wiltshire Rail services - a golden opportunity
Some other Articles
Setting up arrays in C - fixed size at compile time, or dynamic
On time
Private and Public - and things between
Wiltshire Rail services - a golden opportunity
Django - separating the HTML from the view / model
Training Classes - should the training company provide a system for each delegate to use?
A time to be brave? We should ask for what is best for our area.
4759 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 at 50 posts per page

This is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price.

Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2019: 404 The Spa • Melksham, Wiltshire • United Kingdom • SN12 6QL
PH: 01225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/3140_Dja ... model.html • PAGE BUILT: Sat May 27 16:49:10 2017 • BUILD SYSTEM: WomanWithCat