Tasks
Nyní vytvoříme novou aplikaci v rámci daného projektu.
python manage.py startapp tasksUdělám změny v souborech:
PROJECT_NAME\settings.pyPROJECT_NAME\urls.pytasks\views.pytasks\urls.py # tento soubor musíme vytvořit
Vytvoříme složku templates v aplikaci. Ve složce templates vytvořím složku s názvem aplikace tasks
Vytvořím soubory layout.html a index.html. Viz předchozí lekce.
Spustíme webový server a zjistíme, zda máme všechno v pořádku nastaveno.
python manage.py runserverKód
tasks\views.py
tasks = ["foo","bar","baz"]
def index(request):
return render(request, "tasks/index.html", {
"tasks": tasks
})templates\tasks\index.html
<ul>
{% for task in tasks %}
<li>{{ task }}
</li>
{% endfor %}
</ul>tasks\views.py
def add(request):
return render(request, "tasks/add.html")Přidáme cestu pro přidávání úkolů do tasks\urls.py. Kód zde není uveden.
templates\tasks\add.html
{% block body %}
<h1>Add Task</h1>
<form>
<input type="text" name="task">
<input type="submit">
</form>
{% endblock %}Odkazy
templates\tasks\index.html
<!-- <a href="/tasks/add">Add a New Task</a> -->
<a href="{% url 'add' %}">Add a New Task</a>templates\tasks\add.html
<a href="{% url 'index' %}">View All Tasks</a>Video čas 1:10:09
Řešení problému s odkazy: namespaces
Doplníme tasks\urls.py
app_name = "tasks"a upravíme odkazy:
<a href="{% url 'tasks:index' %}">View All Tasks</a>
<a href="{% url 'tasks:add' %}">Add a New Task</a>Zpracování formuláře
templates\tasks\add.html
{% block body %}
<h1>Add Task</h1>
<form action="{% url 'add' %}" method="post">
{% csrf_token %} <!-- ochrana proti CSRF útokům -->
<input type="text" name="task">
<input type="submit">
</form>
<a href="{% url 'index' %}">View All Tasks</a>
{% endblock %}Výklad video čas 1:13:27
Formuláře v Django
tasks\views.py
from django import forms
class NewTaskForm(forms.Form):
task = forms.CharField(label="New Task", max_length=100)
def add(request):
return render(request, "tasks/add.html", {
"form": NewTaskForm()
})Poslední úprava v add.html
templates\tasks\add.html
{% block body %}
<h1>Add Task</h1>
<form action="{% url 'add' %}" method="post">
{% csrf_token %}
{{ form }}
<input type="submit">
</form>
<a href="{% url 'index' %}">View All Tasks</a>
{% endblock %}Výklad video čas 1:21:05 (úprava formuláře, kontrola v prohlížeči a druhá na serveru)
Finální verze tasks\views.py
from django import forms
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
class NewTaskForm(forms.Form):
task = forms.CharField(label="New Task")
# priority = forms.IntegerField(label="Priority", min_value=1, max_value=5)
# Create your views here.
def index(request):
if "tasks" not in request.session:
request.session["tasks"] = []
return render(request, "tasks/index.html", {
"tasks": request.session["tasks"]
})
def add(request):
if request.method == "POST":
form = NewTaskForm(request.POST)
if form.is_valid():
task = form.cleaned_data["task"]
request.session["tasks"] += [task]
return HttpResponseRedirect(reverse("index"))
else:
return render(request, "tasks/add.html", {
"form": form
})
else:
return render(request, "tasks/add.html", {
"form": NewTaskForm()
})Nakonec je třeba provést migrace kvůli session.
python manage.py migrateV tuto chvíli bystě měli umět naprogramovat např. aplikaci, která zobrazuje náhodné vtipy pomocí knihovny pyjokes. Nebo aplikaci, která zobrazuje náhodné citáty pomocí knihovny quoters.
Jedničkáři si zkusí vyřešit Projekt 1 - Wiki