Browse Source

Working on Pygame and Django

pull/52/head
Jure Šorn 4 years ago
parent
commit
b23a9d08a1
2 changed files with 453 additions and 0 deletions
  1. 243
      README.md
  2. 210
      index.html

243
README.md

@ -2906,6 +2906,249 @@ simpleaudio.play_buffer(samples_b, 1, 2, F)
``` ```
Pygame
------
### Example
#### Runs a simple Mario game:
```python
import collections, enum, itertools, pygame, random, math, dataclasses, random
D = enum.Enum('D', 'n e s w')
P = collections.namedtuple('P', 'x y')
Mario = dataclasses.make_dataclass('Mario', ['rect', 'spd', 'facing_left', 'running_cycle'])
RECT_SIDE, SCR_SIDE, MAX_SPEED = 16, 25, P(x=5, y=10)
COORDS = [p for p in itertools.product(range(SCR_SIDE), repeat=2) if {*p} & {0, SCR_SIDE-1}] +\
[(random.randint(1, SCR_SIDE-2), random.randint(2, SCR_SIDE-2)) for _ in range(62)]
FLOORS = [pygame.Rect(x*RECT_SIDE, y*RECT_SIDE, RECT_SIDE, RECT_SIDE) for x, y in COORDS]
IMAGE = pygame.image.load('mario_bros.png')
FRAMES = [IMAGE.subsurface(pygame.Rect(x*16, 0, 16, 16)) for x in range(7)]
FRAMES += [pygame.transform.flip(f, True, False) for f in FRAMES]
def main():
pygame.init()
screen = pygame.display.set_mode(2 * [SCR_SIDE*RECT_SIDE])
mario = Mario(pygame.Rect(16, 16, 16, 16), P(0, 0), False, itertools.cycle(range(3)))
while not any(event.type == pygame.QUIT for event in pygame.event.get()):
keys = {pygame.K_UP: D.n, pygame.K_RIGHT: D.e, pygame.K_DOWN: D.s, pygame.K_LEFT: D.w}
pressed = {keys.get(i, None) for i, on in enumerate(pygame.key.get_pressed()) if on}
update_speed(mario, pressed)
update_position(mario)
draw(screen, mario, pressed)
pygame.time.wait(28)
def update_speed(mario, pressed):
bounds = get_boundaries(mario.rect)
x, y = mario.spd
x += 2 * ((D.e in pressed) - (D.w in pressed))
x = math.copysign(abs(x) - 1, x) if x else 0
y += 1 if D.s not in bounds else (-10 if D.n in pressed else 0)
speed = stop_on_collision(P(x, y), bounds)
mario.spd = P(*[max(-thresh, min(thresh, s)) for thresh, s in zip(MAX_SPEED, speed)])
def update_position(mario):
larger_speed = max(abs(s) for s in mario.spd)
if larger_speed == 0:
return
delta, old_p = P(0, 0), mario.rect.topleft
for _ in range(int(larger_speed)):
mario.spd = stop_on_collision(mario.spd, get_boundaries(mario.rect))
delta = P(*[s/larger_speed + dlt for s, dlt in zip(mario.spd, delta)])
mario.rect.topleft = [sum(a) for a in zip(old_p, delta)]
def get_boundaries(rect):
deltas = {D.n: (0, -1), D.e: (1, 0), D.s: (0, 1), D.w: (-1, 0)}
return {d for d, delta in deltas.items() if rect.move(delta).collidelist(FLOORS) != -1}
def stop_on_collision(spd, bounds):
return P(x=0 if (D.w in bounds and spd.x < 0) or (D.e in bounds and spd.x > 0) else spd.x,
y=0 if (D.n in bounds and spd.y < 0) or (D.s in bounds and spd.y > 0) else spd.y)
def draw(screen, mario, pressed):
screen.fill((0, 0, 0))
mario.facing_left = mario.spd.x < 0 if mario.spd.x else mario.facing_left
screen.blit(FRAMES[get_frame_index(mario, pressed) + mario.facing_left*7], mario.rect)
for rect in FLOORS:
pygame.draw.rect(screen, (255, 100, 0), rect)
pygame.display.flip()
def get_frame_index(mario, pressed):
if D.s not in get_boundaries(mario.rect):
return 4
return next(mario.running_cycle) if {D.w, D.e} & pressed else 6
if __name__ == '__main__':
main()
```
Django
------
```bash
$ pip3 install Django
$ django-admin startproject mysite
```
```bash
$ python3 manage.py startapp polls # http://localhost:8000/polls/
$ python3 manage.py migrate
$ python3 manage.py makemigrations polls
$ python3 manage.py sqlmigrate polls 0001
$ python3 manage.py migrate
$ python3 manage.py shell
$ python3 manage.py createsuperuser
$ python3 manage.py runserver # http://127.0.0.1:8000/admin/
$ python3 manage.py runserver # Runs sever internally on port 8000.
$ python3 manage.py runserver <port> # Runs sever internally.
$ python3 manage.py runserver 0:<port> # Runs server externally.
```
### Files
```text
mysite/
mysite/
settings.py
urls.py
polls/
admin.py
models.py
urls.py
views.py
templates/
polls/
detail.html
index.html
results.html
```
#### mysite/mysite/settings.py
```python
INSTALLED_APPS = [
'polls.apps.PollsConfig',
...
```
#### mysite/mysite/urls.py
```python
urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^admin/', admin.site.urls),
]
```
#### mysite/polls/admin.py
```python
from django.contrib import admin
from .models import Question
admin.site.register(Question)
```
#### mysite/polls/models.py
```python
from django.db import models
class Question(models.Model):
text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
```
#### mysite/polls/urls.py
```python
from django.conf.urls import url
from . import views
app_name = 'polls'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]
```
#### mysite/polls/views.py
```python
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.views import generic
from .models import Choice, Question
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'
def get_queryset(self):
return Question.objects.order_by('-pub_date')[:5]
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected_choice = question.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
data = {'question': question, 'error_message': "You didn't select a choice."}
return render(request, 'polls/detail.html', data)
else:
selected_choice.votes += 1
selected_choice.save()
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
```
#### mysite/polls/templates/polls/index.html
```html
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="{% url 'polls:detail' question.id %}">{{ question.text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
```
#### mysite/polls/templates/polls/detail.html
```html
<h1>{{ question.text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}"
value="{{ choice.id }}"/>
<label for="choice{{ forloop.counter }}">{{ choice.text }}</label><br/>
{% endfor %}
<input type="submit" value="Vote" />
</form>
```
#### mysite/polls/templates/polls/results.html
```html
<h1>{{ question.text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>
```
Basic Script Template Basic Script Template
--------------------- ---------------------
```python ```python

210
index.html

@ -2474,6 +2474,216 @@ simpleaudio.play_buffer(samples_b, <span class="hljs-number">1</span>, <span cla
</code></pre></div></div> </code></pre></div></div>
<div><h2 id="pygame"><a href="#pygame" name="pygame">#</a>Pygame</h2><div><h3 id="example-3">Example</h3><div><h4 id="runsasimplemariogame">Runs a simple Mario game:</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">import</span> collections, enum, itertools, pygame, random, math, dataclasses, random
D = enum.Enum(<span class="hljs-string">'D'</span>, <span class="hljs-string">'n e s w'</span>)
P = collections.namedtuple(<span class="hljs-string">'P'</span>, <span class="hljs-string">'x y'</span>)
Mario = dataclasses.make_dataclass(<span class="hljs-string">'Mario'</span>, [<span class="hljs-string">'rect'</span>, <span class="hljs-string">'spd'</span>, <span class="hljs-string">'facing_left'</span>, <span class="hljs-string">'running_cycle'</span>])
RECT_SIDE, SCR_SIDE, MAX_SPEED = <span class="hljs-number">16</span>, <span class="hljs-number">25</span>, P(x=<span class="hljs-number">5</span>, y=<span class="hljs-number">10</span>)
COORDS = [p <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> itertools.product(range(SCR_SIDE), repeat=<span class="hljs-number">2</span>) <span class="hljs-keyword">if</span> {*p} &amp; {<span class="hljs-number">0</span>, SCR_SIDE<span class="hljs-number">-1</span>}] +\
[(random.randint(<span class="hljs-number">1</span>, SCR_SIDE<span class="hljs-number">-2</span>), random.randint(<span class="hljs-number">2</span>, SCR_SIDE<span class="hljs-number">-2</span>)) <span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> range(<span class="hljs-number">62</span>)]
FLOORS = [pygame.Rect(x*RECT_SIDE, y*RECT_SIDE, RECT_SIDE, RECT_SIDE) <span class="hljs-keyword">for</span> x, y <span class="hljs-keyword">in</span> COORDS]
IMAGE = pygame.image.load(<span class="hljs-string">'mario_bros.png'</span>)
FRAMES = [IMAGE.subsurface(pygame.Rect(x*<span class="hljs-number">16</span>, <span class="hljs-number">0</span>, <span class="hljs-number">16</span>, <span class="hljs-number">16</span>)) <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> range(<span class="hljs-number">7</span>)]
FRAMES += [pygame.transform.flip(f, <span class="hljs-keyword">True</span>, <span class="hljs-keyword">False</span>) <span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> FRAMES]
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
pygame.init()
screen = pygame.display.set_mode(<span class="hljs-number">2</span> * [SCR_SIDE*RECT_SIDE])
mario = Mario(pygame.Rect(<span class="hljs-number">16</span>, <span class="hljs-number">16</span>, <span class="hljs-number">16</span>, <span class="hljs-number">16</span>), P(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>), <span class="hljs-keyword">False</span>, itertools.cycle(range(<span class="hljs-number">3</span>)))
<span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> any(event.type == pygame.QUIT <span class="hljs-keyword">for</span> event <span class="hljs-keyword">in</span> pygame.event.get()):
keys = {pygame.K_UP: D.n, pygame.K_RIGHT: D.e, pygame.K_DOWN: D.s, pygame.K_LEFT: D.w}
pressed = {keys.get(i, <span class="hljs-keyword">None</span>) <span class="hljs-keyword">for</span> i, on <span class="hljs-keyword">in</span> enumerate(pygame.key.get_pressed()) <span class="hljs-keyword">if</span> on}
update_speed(mario, pressed)
update_position(mario)
draw(screen, mario, pressed)
pygame.time.wait(<span class="hljs-number">28</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">update_speed</span><span class="hljs-params">(mario, pressed)</span>:</span>
bounds = get_boundaries(mario.rect)
x, y = mario.spd
x += <span class="hljs-number">2</span> * ((D.e <span class="hljs-keyword">in</span> pressed) - (D.w <span class="hljs-keyword">in</span> pressed))
x = math.copysign(abs(x) - <span class="hljs-number">1</span>, x) <span class="hljs-keyword">if</span> x <span class="hljs-keyword">else</span> <span class="hljs-number">0</span>
y += <span class="hljs-number">1</span> <span class="hljs-keyword">if</span> D.s <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> bounds <span class="hljs-keyword">else</span> (<span class="hljs-number">-10</span> <span class="hljs-keyword">if</span> D.n <span class="hljs-keyword">in</span> pressed <span class="hljs-keyword">else</span> <span class="hljs-number">0</span>)
speed = stop_on_collision(P(x, y), bounds)
mario.spd = P(*[max(-thresh, min(thresh, s)) <span class="hljs-keyword">for</span> thresh, s <span class="hljs-keyword">in</span> zip(MAX_SPEED, speed)])
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">update_position</span><span class="hljs-params">(mario)</span>:</span>
larger_speed = max(abs(s) <span class="hljs-keyword">for</span> s <span class="hljs-keyword">in</span> mario.spd)
<span class="hljs-keyword">if</span> larger_speed == <span class="hljs-number">0</span>:
<span class="hljs-keyword">return</span>
delta, old_p = P(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>), mario.rect.topleft
<span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> range(int(larger_speed)):
mario.spd = stop_on_collision(mario.spd, get_boundaries(mario.rect))
delta = P(*[s/larger_speed + dlt <span class="hljs-keyword">for</span> s, dlt <span class="hljs-keyword">in</span> zip(mario.spd, delta)])
mario.rect.topleft = [sum(a) <span class="hljs-keyword">for</span> a <span class="hljs-keyword">in</span> zip(old_p, delta)]
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_boundaries</span><span class="hljs-params">(rect)</span>:</span>
deltas = {D.n: (<span class="hljs-number">0</span>, <span class="hljs-number">-1</span>), D.e: (<span class="hljs-number">1</span>, <span class="hljs-number">0</span>), D.s: (<span class="hljs-number">0</span>, <span class="hljs-number">1</span>), D.w: (<span class="hljs-number">-1</span>, <span class="hljs-number">0</span>)}
<span class="hljs-keyword">return</span> {d <span class="hljs-keyword">for</span> d, delta <span class="hljs-keyword">in</span> deltas.items() <span class="hljs-keyword">if</span> rect.move(delta).collidelist(FLOORS) != <span class="hljs-number">-1</span>}
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">stop_on_collision</span><span class="hljs-params">(spd, bounds)</span>:</span>
<span class="hljs-keyword">return</span> P(x=<span class="hljs-number">0</span> <span class="hljs-keyword">if</span> (D.w <span class="hljs-keyword">in</span> bounds <span class="hljs-keyword">and</span> spd.x &lt; <span class="hljs-number">0</span>) <span class="hljs-keyword">or</span> (D.e <span class="hljs-keyword">in</span> bounds <span class="hljs-keyword">and</span> spd.x &gt; <span class="hljs-number">0</span>) <span class="hljs-keyword">else</span> spd.x,
y=<span class="hljs-number">0</span> <span class="hljs-keyword">if</span> (D.n <span class="hljs-keyword">in</span> bounds <span class="hljs-keyword">and</span> spd.y &lt; <span class="hljs-number">0</span>) <span class="hljs-keyword">or</span> (D.s <span class="hljs-keyword">in</span> bounds <span class="hljs-keyword">and</span> spd.y &gt; <span class="hljs-number">0</span>) <span class="hljs-keyword">else</span> spd.y)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">draw</span><span class="hljs-params">(screen, mario, pressed)</span>:</span>
screen.fill((<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>))
mario.facing_left = mario.spd.x &lt; <span class="hljs-number">0</span> <span class="hljs-keyword">if</span> mario.spd.x <span class="hljs-keyword">else</span> mario.facing_left
screen.blit(FRAMES[get_frame_index(mario, pressed) + mario.facing_left*<span class="hljs-number">7</span>], mario.rect)
<span class="hljs-keyword">for</span> rect <span class="hljs-keyword">in</span> FLOORS:
pygame.draw.rect(screen, (<span class="hljs-number">255</span>, <span class="hljs-number">100</span>, <span class="hljs-number">0</span>), rect)
pygame.display.flip()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_frame_index</span><span class="hljs-params">(mario, pressed)</span>:</span>
<span class="hljs-keyword">if</span> D.s <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> get_boundaries(mario.rect):
<span class="hljs-keyword">return</span> <span class="hljs-number">4</span>
<span class="hljs-keyword">return</span> next(mario.running_cycle) <span class="hljs-keyword">if</span> {D.w, D.e} &amp; pressed <span class="hljs-keyword">else</span> <span class="hljs-number">6</span>
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
main()
</code></pre></div></div></div>
<div><h2 id="django"><a href="#django" name="django">#</a>Django</h2><pre><code class="bash language-bash hljs">$ pip3 install Django
$ django-admin startproject mysite
</code></pre></div>
<pre><code class="bash language-bash hljs">$ python3 manage.py startapp polls <span class="hljs-comment"># http://localhost:8000/polls/</span>
$ python3 manage.py migrate
$ python3 manage.py makemigrations polls
$ python3 manage.py sqlmigrate polls 0001
$ python3 manage.py migrate
$ python3 manage.py shell
$ python3 manage.py createsuperuser
$ python3 manage.py runserver <span class="hljs-comment"># http://127.0.0.1:8000/admin/</span>
$ python3 manage.py runserver <span class="hljs-comment"># Runs sever internally on port 8000.</span>
$ python3 manage.py runserver &lt;port&gt; <span class="hljs-comment"># Runs sever internally.</span>
$ python3 manage.py runserver 0:&lt;port&gt; <span class="hljs-comment"># Runs server externally.</span>
</code></pre>
<div><h3 id="files">Files</h3><pre><code class="text language-text">mysite/
mysite/
settings.py
urls.py
polls/
admin.py
models.py
urls.py
views.py
templates/
polls/
detail.html
index.html
results.html
</code></pre></div>
<div><h4 id="mysitemysitesettingspy">mysite/mysite/settings.py</h4><pre><code class="python language-python hljs">INSTALLED_APPS = [
<span class="hljs-string">'polls.apps.PollsConfig'</span>,
...
</code></pre></div>
<div><h4 id="mysitemysiteurlspy">mysite/mysite/urls.py</h4><pre><code class="python language-python hljs">urlpatterns = [
url(<span class="hljs-string">r'^polls/'</span>, include(<span class="hljs-string">'polls.urls'</span>)),
url(<span class="hljs-string">r'^admin/'</span>, admin.site.urls),
]
</code></pre></div>
<div><h4 id="mysitepollsadminpy">mysite/polls/admin.py</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> django.contrib <span class="hljs-keyword">import</span> admin
<span class="hljs-keyword">from</span> .models <span class="hljs-keyword">import</span> Question
admin.site.register(Question)
</code></pre></div>
<div><h4 id="mysitepollsmodelspy">mysite/polls/models.py</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> django.db <span class="hljs-keyword">import</span> models
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Question</span><span class="hljs-params">(models.Model)</span>:</span>
text = models.CharField(max_length=<span class="hljs-number">200</span>)
pub_date = models.DateTimeField(<span class="hljs-string">'date published'</span>)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Choice</span><span class="hljs-params">(models.Model)</span>:</span>
question = models.ForeignKey(Question, on_delete=models.CASCADE)
text = models.CharField(max_length=<span class="hljs-number">200</span>)
votes = models.IntegerField(default=<span class="hljs-number">0</span>)
</code></pre></div>
<div><h4 id="mysitepollsurlspy">mysite/polls/urls.py</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> django.conf.urls <span class="hljs-keyword">import</span> url
<span class="hljs-keyword">from</span> . <span class="hljs-keyword">import</span> views
app_name = <span class="hljs-string">'polls'</span>
urlpatterns = [
url(<span class="hljs-string">r'^$'</span>, views.IndexView.as_view(), name=<span class="hljs-string">'index'</span>),
url(<span class="hljs-string">r'^(?P&lt;pk&gt;[0-9]+)/$'</span>, views.DetailView.as_view(), name=<span class="hljs-string">'detail'</span>),
url(<span class="hljs-string">r'^(?P&lt;pk&gt;[0-9]+)/results/$'</span>, views.ResultsView.as_view(), name=<span class="hljs-string">'results'</span>),
url(<span class="hljs-string">r'^(?P&lt;question_id&gt;[0-9]+)/vote/$'</span>, views.vote, name=<span class="hljs-string">'vote'</span>),
]
</code></pre></div>
<div><h4 id="mysitepollsviewspy">mysite/polls/views.py</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> django.shortcuts <span class="hljs-keyword">import</span> get_object_or_404, render
<span class="hljs-keyword">from</span> django.http <span class="hljs-keyword">import</span> HttpResponseRedirect
<span class="hljs-keyword">from</span> django.urls <span class="hljs-keyword">import</span> reverse
<span class="hljs-keyword">from</span> django.views <span class="hljs-keyword">import</span> generic
<span class="hljs-keyword">from</span> .models <span class="hljs-keyword">import</span> Choice, Question
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IndexView</span><span class="hljs-params">(generic.ListView)</span>:</span>
template_name = <span class="hljs-string">'polls/index.html'</span>
context_object_name = <span class="hljs-string">'latest_question_list'</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_queryset</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">return</span> Question.objects.order_by(<span class="hljs-string">'-pub_date'</span>)[:<span class="hljs-number">5</span>]
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DetailView</span><span class="hljs-params">(generic.DetailView)</span>:</span>
model = Question
template_name = <span class="hljs-string">'polls/detail.html'</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ResultsView</span><span class="hljs-params">(generic.DetailView)</span>:</span>
model = Question
template_name = <span class="hljs-string">'polls/results.html'</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">vote</span><span class="hljs-params">(request, question_id)</span>:</span>
question = get_object_or_404(Question, pk=question_id)
<span class="hljs-keyword">try</span>:
selected_choice = question.choice_set.get(pk=request.POST[<span class="hljs-string">'choice'</span>])
<span class="hljs-keyword">except</span> (KeyError, Choice.DoesNotExist):
data = {<span class="hljs-string">'question'</span>: question, <span class="hljs-string">'error_message'</span>: <span class="hljs-string">"You didn't select a choice."</span>}
<span class="hljs-keyword">return</span> render(request, <span class="hljs-string">'polls/detail.html'</span>, data)
<span class="hljs-keyword">else</span>:
selected_choice.votes += <span class="hljs-number">1</span>
selected_choice.save()
<span class="hljs-keyword">return</span> HttpResponseRedirect(reverse(<span class="hljs-string">'polls:results'</span>, args=(question.id,)))
</code></pre></div>
<div><h4 id="mysitepollstemplatespollsindexhtml">mysite/polls/templates/polls/index.html</h4><pre><code class="html language-html python hljs xml">{% if latest_question_list %}
<span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
{% for question in latest_question_list %}
<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"{% url 'polls:detail' question.id %}"</span>&gt;</span>{{ question.text }}<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
{% endfor %}
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
{% else %}
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>No polls are available.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
{% endif %}
</code></pre></div>
<div><h4 id="mysitepollstemplatespollsdetailhtml">mysite/polls/templates/polls/detail.html</h4><pre><code class="html language-html python hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>{{ question.text }}<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
{% if error_message %}<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span>{{ error_message }}<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>{% endif %}
<span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"{% url 'polls:vote' question.id %}"</span> <span class="hljs-attr">method</span>=<span class="hljs-string">"post"</span>&gt;</span>
{% csrf_token %}
{% for choice in question.choice_set.all %}
<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"radio"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"choice"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"choice{{ forloop.counter }}"</span>
<span class="hljs-attr">value</span>=<span class="hljs-string">"{{ choice.id }}"</span>/&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"choice{{ forloop.counter }}"</span>&gt;</span>{{ choice.text }}<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span>
{% endfor %}
<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"Vote"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>
</code></pre></div>
<div><h4 id="mysitepollstemplatespollsresultshtml">mysite/polls/templates/polls/results.html</h4><pre><code class="html language-html python hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>{{ question.text }}<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
{% for choice in question.choice_set.all %}
<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>{{ choice.text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
{% endfor %}
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"{% url 'polls:detail' question.id %}"</span>&gt;</span>Vote again?<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></pre></div>
<div><h2 id="basicscripttemplate"><a href="#basicscripttemplate" name="basicscripttemplate">#</a>Basic Script Template</h2><pre><code class="python language-python hljs"><span class="hljs-comment">#!/usr/bin/env python3</span> <div><h2 id="basicscripttemplate"><a href="#basicscripttemplate" name="basicscripttemplate">#</a>Basic Script Template</h2><pre><code class="python language-python hljs"><span class="hljs-comment">#!/usr/bin/env python3</span>
<span class="hljs-comment">#</span> <span class="hljs-comment">#</span>
<span class="hljs-comment"># Usage: .py</span> <span class="hljs-comment"># Usage: .py</span>

Loading…
Cancel
Save