Hi Rick,
I'll try to explain, but it's really more about Python than Django...
(I'm not familiar with the tutorial app, so I'm basing my answers on what code you copied into your email.)
That import of Poll that you see in details.py doesn't even enter into it. It's only used on the line that says "p = get_object_or_404(...". In fact (and here's where my newness in Django shows), I don't think that Poll is even visible (in scope) in the detail.html template. But the Poll instance that was put passed to "render_to_response(..." is. The "p" variable had an instance of a Poll, and it was bound to the name 'poll' in that bit "{'poll':p}".
Once in the template, it's just a matter of traversing the objects. poll.choice_set.all presumably returns a set (or list?) of Choice instances, which are bound to the variable "choice". Then, it's just a matter resolving the "choice" name on that instance.
Since Python is a dynamically typed language, so you don't need to declare the data type of "choice" before assigning values to it, so there's no need to do something like
Choice choice = null
which you might need to do in a language like Java. If you *did* need to do that, you'd have to import Choice so that the above line would work. Since you *don't* need to do that, and you're never referencing "Choice" in the template, there's no need to import it.
Maybe it would help to think of import as a special kind of assignment operator (that's a gross simplification, but it may help as a metaphor)... Writing
from polls.models import Choice
is a bit similar in concept to saying something like
Choice = polls.models.Choice #make a local reference the Choice class in the polls.models package.
Does that help at all?
Jason