<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://wiki.nosdigitais.teia.org.br/index.php?action=history&amp;feed=atom&amp;title=Microtutoriais_A</id>
	<title>Microtutoriais A - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.nosdigitais.teia.org.br/index.php?action=history&amp;feed=atom&amp;title=Microtutoriais_A"/>
	<link rel="alternate" type="text/html" href="http://wiki.nosdigitais.teia.org.br/index.php?title=Microtutoriais_A&amp;action=history"/>
	<updated>2026-04-21T23:12:26Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>http://wiki.nosdigitais.teia.org.br/index.php?title=Microtutoriais_A&amp;diff=3123&amp;oldid=prev</id>
		<title>Rfabbri: /* Django12: Generic Views */</title>
		<link rel="alternate" type="text/html" href="http://wiki.nosdigitais.teia.org.br/index.php?title=Microtutoriais_A&amp;diff=3123&amp;oldid=prev"/>
		<updated>2011-09-18T15:04:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Django12: Generic Views&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pt-BR&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Edição anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Edição das 12h04min de 18 de setembro de 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l411&quot;&gt;Linha 411:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linha 411:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Pronto. Delete este views do seu views.py (as funções index(), details() e results). Verifique como está tudo rodando ok e macio!&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Pronto. Delete este views do seu views.py (as funções index(), details() e results). Verifique como está tudo rodando ok e macio!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Lab Macambira]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Rfabbri</name></author>
	</entry>
	<entry>
		<id>http://wiki.nosdigitais.teia.org.br/index.php?title=Microtutoriais_A&amp;diff=3117&amp;oldid=prev</id>
		<title>Rfabbri: criação dos 12 microtutoriaisA</title>
		<link rel="alternate" type="text/html" href="http://wiki.nosdigitais.teia.org.br/index.php?title=Microtutoriais_A&amp;diff=3117&amp;oldid=prev"/>
		<updated>2011-09-18T14:55:47Z</updated>

		<summary type="html">&lt;p&gt;criação dos 12 microtutoriaisA&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Django1: Baixar e rodar em 3 comandos=&lt;br /&gt;
&lt;br /&gt;
Simplesme baixe o tar.gz do site e rode&lt;br /&gt;
    $ sudo python setup.py install&lt;br /&gt;
depois vá para um dir.. dê um&lt;br /&gt;
    $ python django-admin.py startproject mysite&lt;br /&gt;
inicie o servidor (entra no diretório do projeto)&lt;br /&gt;
    $ python manage.py runserver&lt;br /&gt;
pronto! só ir no endereço que o terminal soltou&lt;br /&gt;
&lt;br /&gt;
=Django2: Fazendo o bixinho acessar um BD.=&lt;br /&gt;
&lt;br /&gt;
    $ python manage.py syncdb&lt;br /&gt;
dá pau até que vc arrume o&lt;br /&gt;
&lt;br /&gt;
    DATABASES = { 'default' :&lt;br /&gt;
&lt;br /&gt;
do settings.py&lt;br /&gt;
&lt;br /&gt;
Pode usar sqlite que fica imediato, mas eu arrumei&lt;br /&gt;
um user mysql rapidinho.&lt;br /&gt;
&lt;br /&gt;
Rode:&lt;br /&gt;
    $ python manage.py syncdb&lt;br /&gt;
Até que não sintamos nada de mais pegando.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Django3: Suas tabelas de BD são classes=&lt;br /&gt;
&lt;br /&gt;
Crie um app:&lt;br /&gt;
&lt;br /&gt;
    $ python manage.py startapp appzinhoCoxa&lt;br /&gt;
&lt;br /&gt;
Coloque 'sitezinhoCoxa' no final da tupla INSTALLED_APPS do settings.py,&lt;br /&gt;
&lt;br /&gt;
Crie estas duas classes no seu appzinhoCoxa/models.py:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;class Poll(models.Model):&lt;br /&gt;
    question = models.CharField(max_length=200)&lt;br /&gt;
    pub_date = models.DateTimeField('date published')&lt;br /&gt;
&lt;br /&gt;
class Choice(models.Model):&lt;br /&gt;
    poll = models.ForeignKey(Poll)&lt;br /&gt;
    choice = models.CharField(max_length=200)&lt;br /&gt;
    votes = models.IntegerField()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Relaxa, vai dar certo. Só falta rodar este comando:&lt;br /&gt;
&lt;br /&gt;
    $ python manage.py sql aexp&lt;br /&gt;
&lt;br /&gt;
A saída deve ser algo muito próximo (ou idêntico) a isso:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE TABLE `aexp_poll` (&lt;br /&gt;
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,&lt;br /&gt;
    `question` varchar(200) NOT NULL,&lt;br /&gt;
    `pub_date` datetime NOT NULL&lt;br /&gt;
)&lt;br /&gt;
;&lt;br /&gt;
CREATE TABLE `aexp_choice` (&lt;br /&gt;
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,&lt;br /&gt;
    `poll_id` integer NOT NULL,&lt;br /&gt;
    `choice` varchar(200) NOT NULL,&lt;br /&gt;
    `votes` integer NOT NULL&lt;br /&gt;
)&lt;br /&gt;
;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pronto! só dê um:&lt;br /&gt;
&lt;br /&gt;
    $ python manage.py syncdb&lt;br /&gt;
&lt;br /&gt;
para seu projeto dar conta de usar a base de dados que vc fez.&lt;br /&gt;
&lt;br /&gt;
=Django4: Interlúdio na shell=&lt;br /&gt;
(fim da parte 1 do tutorial oficial)&lt;br /&gt;
&lt;br /&gt;
Para inicar uma shell com o ambiente bonitinho para&lt;br /&gt;
fazer alterações na mão e colocar coisas nos BD:&lt;br /&gt;
    $ python manage.py shell &lt;br /&gt;
&lt;br /&gt;
Aí pode fazer coisas como:&lt;br /&gt;
&amp;lt;pre&amp;gt;[1]: from aexp.models import Poll, Choice&lt;br /&gt;
[2]: p = Poll(question=&amp;quot;What's up?&amp;quot;, pub_date=datetime.datetime.now())&lt;br /&gt;
[3]: p.save()&lt;br /&gt;
[4]: p.choice_set.create(choice='Not much', votes=0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
etc...&lt;br /&gt;
&lt;br /&gt;
=Django5: Habilite seu Admin=&lt;br /&gt;
(inicio da parte 2 do tutorial)&lt;br /&gt;
&lt;br /&gt;
Depois de descomentar 'django.contrib.admin' do INSTALLED_APPS do settings.py&lt;br /&gt;
&lt;br /&gt;
    $ python manage.py syncdb # porque estamos com um app novo, o admin&lt;br /&gt;
&lt;br /&gt;
Aí é preciso habilitar a URL para acessar o admin, isso é feito no url.py descomentando&lt;br /&gt;
as seguintes três linhas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from django.contrib import admin&lt;br /&gt;
admin.autodiscover()&lt;br /&gt;
(r'^admin/', include(admin.site.urls)),&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A última fica ao final do bloco identado.&lt;br /&gt;
&lt;br /&gt;
Pronto. Inicie o server&lt;br /&gt;
&lt;br /&gt;
    $ python manage.py runserver&lt;br /&gt;
&lt;br /&gt;
e vá para o endereço previsto, provavelmente:&lt;br /&gt;
&lt;br /&gt;
    http://127.0.0.1:8000/admin/&lt;br /&gt;
&lt;br /&gt;
Vualá seu admin tá rodando. Faz login aí, irmão.&lt;br /&gt;
&lt;br /&gt;
=Django6: Faça seu Admin responder=&lt;br /&gt;
&lt;br /&gt;
Depois de devidamente logado, &lt;br /&gt;
&lt;br /&gt;
Crie um arquivo admin.py no diretório do app que startou com startapp.&lt;br /&gt;
Coloque as seguintes linhas neste arquivo admin.py:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from XXXX.models import Poll&lt;br /&gt;
from XXXX.models import Choice&lt;br /&gt;
from django.contrib import admin&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Poll)  &amp;lt;----------------&lt;br /&gt;
admin.site.register(Choice)  &amp;lt;----------------&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
XXX você substitui por appzinhoCoxa ou qualquer nome do app que você fez.&lt;br /&gt;
&lt;br /&gt;
Recarregue a página e veja que o admin já possui uma entrada para o polls.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Troque:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;admin.site.register(Poll)  &amp;lt;----------------&lt;br /&gt;
admin.site.register(Choice)  &amp;lt;----------------&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
por:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;class ChoiceInline(admin.TabularInline):&lt;br /&gt;
    model = Choice&lt;br /&gt;
    extra = 3&lt;br /&gt;
&lt;br /&gt;
class PollAdmin(admin.ModelAdmin):&lt;br /&gt;
    list_display = ('question', 'pub_date', 'was_published_today')&lt;br /&gt;
    fieldsets = [&lt;br /&gt;
        (None,               {'fields': ['question']}),&lt;br /&gt;
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),&lt;br /&gt;
    ]&lt;br /&gt;
    inlines = [ChoiceInline]&lt;br /&gt;
    list_filter = ['pub_date']&lt;br /&gt;
    search_fields = ['question']&lt;br /&gt;
    date_hierarchy = 'pub_date'&lt;br /&gt;
&lt;br /&gt;
admin.site.register(Poll, PollAdmin)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E veja o resultado.&lt;br /&gt;
&lt;br /&gt;
=Django7: Seu Admin é customizável completamente=&lt;br /&gt;
(último da parte 2 do tutorial)&lt;br /&gt;
&lt;br /&gt;
no settings.py mude:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TEMPLATE_DIRS = (&lt;br /&gt;
    &amp;quot;/home/XXXX/mytemplates&amp;quot;, # Change this to your own directory.&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
XXXX é o que você quer. &lt;br /&gt;
&lt;br /&gt;
copie coisas como:&lt;br /&gt;
&lt;br /&gt;
    django/contrib/admin/templates/admin/base_site.html&lt;br /&gt;
para&lt;br /&gt;
    /home/XXXXX/mytemplates/admin/base_site.html.&lt;br /&gt;
&lt;br /&gt;
e não veja a mudança alguma AINDA. Ou tente fuçar no base_site.html&lt;br /&gt;
&lt;br /&gt;
= Django8: Criando respostas às URLs =&lt;br /&gt;
(início da parte 3 do tutorial oficial)&lt;br /&gt;
&lt;br /&gt;
Quando vocẽ deu 'startapp nomedoapp', foi criado&lt;br /&gt;
um diretório com 'nomedoapp'.&lt;br /&gt;
&lt;br /&gt;
São 3 pequenas alterações para poder notar as mudanças.&lt;br /&gt;
A primeira é no settings.py, ajuste a ROOT_URLCONF para&lt;br /&gt;
nomedoPROJ/urls.py assim:&lt;br /&gt;
&lt;br /&gt;
    ROOT_URLCONF = 'nomedoPROJ.urls'&lt;br /&gt;
&lt;br /&gt;
Deixe eu urlpatterns deste jeit (ele fica no seu urls.py):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;urlpatterns = patterns('',&lt;br /&gt;
    (r'^nodedoAPP/$', 'nomedoAPP.views.index'), &amp;lt;---- aqui&lt;br /&gt;
    (r'^admin/', include(admin.site.urls)),&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note a linha destacada que é a única adicionada. E tente perceber&lt;br /&gt;
como ele endereça alguém chamado index dentro do views.py&lt;br /&gt;
do diretório/app nodedoAPP&lt;br /&gt;
&lt;br /&gt;
Coloque agora no views.py a função:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from django.http import HttpResponse&lt;br /&gt;
&lt;br /&gt;
def index(request):&lt;br /&gt;
    return HttpResponse(&amp;quot;Hello, world. You're at the poll index.&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Django9: Utilizando os Templates do Django =&lt;br /&gt;
&lt;br /&gt;
Agora é importante que você tenha ao&lt;br /&gt;
menos as seguintes linhas no seu views.py:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from django.shortcuts import render_to_response&lt;br /&gt;
from nodedoAPP.models import Poll&lt;br /&gt;
&lt;br /&gt;
def index(request):&lt;br /&gt;
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]&lt;br /&gt;
    return render_to_response('nomedoAPP/index.html', {'latest_poll_list': latest_poll_list})&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aí falta-nos colocar este index.html no lugar. Na&lt;br /&gt;
sua pasta de templates, cria uma pasta nomedoAPP, dentro faça um arquivo index.html rodando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;{% if latest_poll_list %}&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
    {% for poll in latest_poll_list %}&lt;br /&gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/nomedoAPP/{{ poll.id }}/&amp;quot;&amp;gt;{{ poll.question }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
{% else %}&lt;br /&gt;
    &amp;lt;p&amp;gt;No polls are available.&amp;lt;/p&amp;gt;&lt;br /&gt;
{% endif %}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ver o efeito, acesse o link relacionado. Algo como:&lt;br /&gt;
    http://127.0.0.1:8000/nomedoAPP/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Django10: Organização das URLs. (Perfumaria) = &lt;br /&gt;
(último do terceiro tutorial)&lt;br /&gt;
&lt;br /&gt;
No urls.py, você pode mudar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;urlpatterns = patterns('',&lt;br /&gt;
    (r'^aexp/$', 'aexp.views.index'),&lt;br /&gt;
    (r'^aexp/(?P&amp;lt;poll_id&amp;gt;\d+)/$', 'aexp.views.detail'),&lt;br /&gt;
    (r'^aexp/(?P&amp;lt;poll_id&amp;gt;\d+)/results/$', 'aexp.views.results'),&lt;br /&gt;
    (r'^aexp/(?P&amp;lt;poll_id&amp;gt;\d+)/vote/$', 'aexp.views.vote'),&lt;br /&gt;
    (r'^admin/', include(admin.site.urls)),&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
para&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;urlpatterns = patterns('aexp.views',&lt;br /&gt;
    (r'^aexp/$', 'index'),&lt;br /&gt;
    (r'^aexp/(?P&amp;lt;poll_id&amp;gt;\d+)/$', 'detail'),&lt;br /&gt;
    (r'^aexp/(?P&amp;lt;poll_id&amp;gt;\d+)/results/$', 'results'),&lt;br /&gt;
    (r'^aexp/(?P&amp;lt;poll_id&amp;gt;\d+)/vote/$', 'vote'),&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
urlpatterns += patterns('',&lt;br /&gt;
    (r'^admin/', include(admin.site.urls)),&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou pode colocar todos os links referentes ao APP aexp dentro&lt;br /&gt;
de um arquivo. Seu urls.py fica assim:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from django.conf.urls.defaults import patterns, include&lt;br /&gt;
&lt;br /&gt;
from django.contrib import admin&lt;br /&gt;
admin.autodiscover()&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('',&lt;br /&gt;
    (r'^polls/', include('polls.urls')),&lt;br /&gt;
    (r'^admin/', include(admin.site.urls)),&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E seu arquivo ./aexp/urls.py fica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from django.conf.urls.defaults import patterns, include&lt;br /&gt;
&lt;br /&gt;
urlpatterns = patterns('polls.views',&lt;br /&gt;
    (r'^$', 'index'),&lt;br /&gt;
    (r'^(?P&amp;lt;poll_id&amp;gt;\d+)/$', 'detail'),&lt;br /&gt;
    (r'^(?P&amp;lt;poll_id&amp;gt;\d+)/results/$', 'results'),&lt;br /&gt;
    (r'^(?P&amp;lt;poll_id&amp;gt;\d+)/vote/$', 'vote'),&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Django11: Django interagindo=&lt;br /&gt;
&lt;br /&gt;
Percebeu que o index.html do seu APP (no meu caso 'aexp')&lt;br /&gt;
lista todas as questões que estão rolando?&lt;br /&gt;
&lt;br /&gt;
Caso você clique em alguma das questões, você será&lt;br /&gt;
redirecionado para um tal de details.html, note o 'href' no seu&lt;br /&gt;
index.html:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pre&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/aexp/{{ poll.id }}/&amp;quot;&amp;gt;{{ poll.question }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E esta linha do seu urls.py:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;pre&amp;gt;(r'^aexp/(?P&amp;lt;poll_id&amp;gt;\d+)/$', 'detail'),&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por fim, veja a função detail do seu views.py. Coloque algo&lt;br /&gt;
como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def detail(request, poll_id):&lt;br /&gt;
    p = get_object_or_404(Poll, pk=poll_id)&lt;br /&gt;
    return render_to_response('aexp/detail.html', {'poll': p},&lt;br /&gt;
                               context_instance=RequestContext(request))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Visto isso. Vamos agir. Coloque no details.html este código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;h1&amp;gt;{{ poll.question }}&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% if error_message %}&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;{{ error_message }}&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;{% endif %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;/aexp/{{ poll.id }}/vote/&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
{% csrf_token %}&lt;br /&gt;
{% for choice in poll.choice_set.all %}&lt;br /&gt;
    &amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;choice&amp;quot; id=&amp;quot;choice{{ forloop.counter }}&amp;quot; value=&amp;quot;{{ choice.id }}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;label for=&amp;quot;choice{{ forloop.counter }}&amp;quot;&amp;gt;{{ choice.choice }}&amp;lt;/label&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Vote&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como no seu urls.py tem a linha:&lt;br /&gt;
&lt;br /&gt;
    (r'^aexp/(?P&amp;lt;poll_id&amp;gt;\d+)/$', 'detail'),&lt;br /&gt;
&lt;br /&gt;
Você precisa fazer a função para vote (no seu views.py):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def vote(request, poll_id):&lt;br /&gt;
    p = get_object_or_404(Poll, pk=poll_id)&lt;br /&gt;
    try:&lt;br /&gt;
        selected_choice = p.choice_set.get(pk=request.POST['choice'])&lt;br /&gt;
    except (KeyError, Choice.DoesNotExist):&lt;br /&gt;
        # Redisplay the poll voting form.&lt;br /&gt;
        return render_to_response('aexp/detail.html', {&lt;br /&gt;
            'poll': p,&lt;br /&gt;
            'error_message': &amp;quot;You didn't select a choice.&amp;quot;,&lt;br /&gt;
        }, context_instance=RequestContext(request))&lt;br /&gt;
    else:&lt;br /&gt;
        selected_choice.votes += 1&lt;br /&gt;
        selected_choice.save()&lt;br /&gt;
        # Always return an HttpResponseRedirect after successfully dealing&lt;br /&gt;
        # with POST data. This prevents data from being posted twice if a&lt;br /&gt;
        # user hits the Back button.&lt;br /&gt;
        return HttpResponseRedirect(reverse('aexp.views.results', args=(p.id,)))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por fim, basta fazer a função 'results' que está requerida no vote():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def results(request, poll_id):&lt;br /&gt;
    p = get_object_or_404(Poll, pk=poll_id)&lt;br /&gt;
    return render_to_response('aexp/results.html', {'poll': p})&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E fazer seu results.html, eis um modelo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;h1&amp;gt;{{ poll.question }}&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
{% for choice in poll.choice_set.all %}&lt;br /&gt;
    &amp;lt;li&amp;gt;{{ choice.choice }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}&amp;lt;/li&amp;gt;&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a href=&amp;quot;/polls/{{ poll.id }}/&amp;quot;&amp;gt;Vote again?&amp;lt;/a&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pronto! Você viu seu Django interagindo com graça e elegância. Note que pode ser importante que você vá na tela de administração e registre algumas perguntas...&lt;br /&gt;
&lt;br /&gt;
=Django12: Generic Views=&lt;br /&gt;
&lt;br /&gt;
As 'generic views' são atalhos para a seguinte rotina corriqueira: &lt;br /&gt;
busca-se os dados no banco de dados a partir de configurações da URL, retornando uma página renderizada com os dados buscados.&lt;br /&gt;
&lt;br /&gt;
De forma resumida, faremos isso especificando diretamente na&lt;br /&gt;
urls.py que utilizaremos uma generic view.&lt;br /&gt;
&lt;br /&gt;
Primeiro adicione esta linha no seu urls.py:&lt;br /&gt;
&lt;br /&gt;
    from django.views.generic import DetailView, ListView&lt;br /&gt;
&lt;br /&gt;
Depois delete a parte do urlspatterns que não está relacionada ao admin, coloque isso no lugar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;urlpatterns = patterns('',&lt;br /&gt;
    (r'^aexp/$',&lt;br /&gt;
        ListView.as_view(&lt;br /&gt;
            queryset=Poll.objects.order_by('-pub_date')[:5],&lt;br /&gt;
            context_object_name='latest_poll_list',&lt;br /&gt;
            template_name='aexp/index.html')),&lt;br /&gt;
    (r'^aexp/(?P&amp;lt;pk&amp;gt;\d+)/$',&lt;br /&gt;
        DetailView.as_view(&lt;br /&gt;
            model=Poll,&lt;br /&gt;
            template_name='aexp/detail.html')),&lt;br /&gt;
    url(r'^aexp/(?P&amp;lt;pk&amp;gt;\d+)/results/$',&lt;br /&gt;
        DetailView.as_view(&lt;br /&gt;
            model=Poll,&lt;br /&gt;
            template_name='aexp/results.html'),&lt;br /&gt;
        name='aexp_results'),&lt;br /&gt;
    (r'^aexp/(?P&amp;lt;poll_id&amp;gt;\d+)/vote/$', 'aexp.views.vote'),&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repare como utilzam os o ListView e o DetailView que importamos.&lt;br /&gt;
&lt;br /&gt;
O ListView é dedicado a dispor uma lista de itens na página e é simples: o queryset é sua lista de objetos a serem apresentados. A string atribuida ao context_object é o nome que vai aparecer no seu template. Veja seu template como especificado no template_name.html&lt;br /&gt;
&lt;br /&gt;
O DetailView é  dedicado a mostrar os detalhes sobre algum objeto. É necessário especificar o 'model' (no nosso caso é o Poll). O segundo DetailView tem 2 detalhes: primeiramente o 'name' está nomeando a URL para que ela possa ser referenciada depois. Em segundo lugar, a função url encapsula todo mundo: o padrão, o modelo, o template e o nome.&lt;br /&gt;
&lt;br /&gt;
O útlimo passo é arrumar o HttpresponseRedirect para:&lt;br /&gt;
    return HttpResponseRedirect(reverse('poll_results', args=(p.id,)))&lt;br /&gt;
&lt;br /&gt;
E este reverse permanece um mistério... ;O)&lt;br /&gt;
&lt;br /&gt;
Pronto. Delete este views do seu views.py (as funções index(), details() e results). Verifique como está tudo rodando ok e macio!&lt;/div&gt;</summary>
		<author><name>Rfabbri</name></author>
	</entry>
</feed>