For 2021 - online Python 3 training - see ((here)).
Our plans were to retire in summer 2020 and see the world, but Coronavirus has lead us into a lot of lockdown programming in Python 3 and PHP 7. We can now offer tailored online training - small groups, real tutors - works really well for groups of 4 to 14 delegates. Anywhere in the world; course language English.
Please ask about private 'maintenance' training for Python 2, Tcl, 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:
Model
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'),
(r'^hosts/(?P\w+)\.htm','nets.views.single'),
(r'^hosts/(?P\w+)','nets.views.integral')
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')]
else:
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 © {{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:
[('home','http://www.wellho.net'),('hostindex','index'),(system_id,system_id)]
And in the template, we'll replace our simple variable place holder with the following code:
{% for element in trail %}
<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:
(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 [1745] Moodle, Drupal, Django (and Rails) - (2008-08-08) [3136] A framework with python - Django - first steps - (2011-01-17) [3138] Django - adding your own views, and then templating your views. - (2011-01-18) [3139] Steering our Python courses towards wxPython, SQLite and Django - (2011-01-19) [3624] Why do we need a Model, View, Controller architecture? - (2012-02-25) [3633] Nesting Templates in Django - (2012-03-02) [3634] Defining database relations in your Django model - (2012-03-02) [3639] Demonstration of a form using Django - (2012-03-04) [3640] Sessions (Shopping Carts) in Django - the Python Web Framework - (2012-03-05) [3698] How to stop forms on other sites submitting to your scripts - (2012-04-15) [3705] Django Training Courses - UK - (2012-04-23) [3919] What is a web framework? - (2012-11-10) [4013] Web Frameworks - nested templates - (2013-02-22) [4095] Django - first steps - Updated - (2013-05-19)
Some other Articles
Setting up arrays in C - fixed size at compile time, or dynamicOn timePrivate and Public - and things betweenWiltshire Rail services - a golden opportunityDjango - separating the HTML from the view / modelTraining 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).
|
|