Dag 5:
Modeller & Golive
Läxförhör Django
.get()
templates
models.py
<html>
views.pyurls.py
/quiz/1 def quiz()
Mål för idag
• Förstå vad en databas är och hur den används
• Förstå hur django hanterar formulärdata
• Kunna använda sessionen för att lagra data
• En sajt som är live!
Tidsschema
• 09.00 - 10.00: Dagens presentation
• 10.00 - 14.00: Dagens tutorial
• 14.00 - 16.00: Golive (börja senast 14.00!)
• 16.00 - 16.30: Samling och wrapup
• 16.30 - 17.00: Visa för andra Tjejer kodar-deltagare
Vad är en databas?
Land Mat Namn År
1 … … … …
2 … … … …
3 … … … …
4 … … … …
Färg Vikt Vem När
1 … … … …
2 … … … …
3 … … … …
4 … … … …Tabell
Tabell
Används via kod…
SQL
Inte magiska…
Utdata Indata Namn År
1 … … … …
2 … … … …
3 … … … …
4 … … … …
Färg Vikt Vem När
1 … … … …
2 … … … …
3 … … … …
4 … … … …
SQL?!
SELECT COUNT(id) FROM user WHERE reg_date > "2000-01-01"
SELECT username FROM user WHERE username LIKE "emil%"
models.py
class Quiz(models.Model):
quiz_number = models.PositiveIntegerField()
name = models.CharField(max_length=100)
description = models.TextField()
Vår Quiz-Model
id quiz_number name description
1 1 Klassiska böcker Hur bra kan…
2 2 Största fotbollslagen Kan du dina lag?
3 3 Mest kända hackare Hackerhistoria är…
4 … … …
Hur använder jag min
Quiz-modell?
from quiz.models import Quiz
quizzes = Quiz.objects.all()
SELECT * from quiz_quiz
quizzes = [quiz1, quiz2, quiz3]
quizzes[0].name ”Klassiska böcker”
Vad mer kan vi göra?
• Skapa data:
• Quiz.objects.create(quiz_number=4,
name=”Min quiz”, description=”Här är min quiz”)
• Hämta ut data:
• Quiz.objects.filter(quiz_number__gt=3).count()
• Quiz.objects.filter(name__startswith=”Klassiska”)
• Quiz.objects.get(quiz_number=”1”)
Vad mer kan vi göra?
• Uppdatera data:
• quiz = Quiz.objects.get(quiz_number=”1”)
• quiz.name = “Starwars-quizzen”
• quiz.save()
• Ta bort data:
• Quiz.objects.filter(name__contains=”test”).delete()
models.py
class Question(models.Model):
question = models.TextField()
answer1 = models.CharField(max_length=100)
answer2 = models.CharField(max_length=100)
answer3 = models.CharField(max_length=100)
correct = models.PositiveIntegerField()
quiz = models.ForeignKey(Quiz)
Vår Question-model
id question answer1 answer2 answer3 correct quiz_id
1 Hur många bultar har… 12 123 1234 2 1
2 Välj ett datum 1 jan 10 feb 29 maj 3 1
3 … … … … … …
4 … … … … … …
Migrations
• python manage.py makemigrations
• Migrations for 'quiz':
0001_initial.py:
- Create model Question
- Create model Quiz
- Add field quiz to question
• python manage.py migrate
Django Admin
Formulär
<form action="/min-sida/">
<input type="radio" name="year" value=”2015"> 2015
<input type="radio" name="year" value="2016"> 2016
<input type="radio" name="year" value="2017"> 2017
<button type="submit">Next</button>
</form>
Data som skickas: year=2017
Standardval
<form action="/min-sida/">
<input type="radio" name="year" value=”2015" checked> 2015
<input type="radio" name="year" value="2016"> 2016
<input type="radio" name="year" value="2017"> 2017
<button type="submit">Next</button>
</form>
Data som skickas: year=2017
Hantera formulärdata
def answer(request):
year = request.POST["year"]
return HttpResponse("Du skickade med " + year)
Hur spara svaren?
• Behöver bara vara temporärt, onödigt med databas
• En vanlig variabel fungerar inte, när man laddar om
sidan så nollställs allt…
• Lösning: Sessionen!
Sessionen
saved_answers = {
"1": 2,
"2": 3,
"3": 3,
"4": 1,
}
saved_answers["5"] = 1
saved_answers = {
"1": 2,
"2": 3,
"3": 3,
"4": 1,
"5": 1,
}
Sessionen
def answer(request, quiz_number, question_number):
saved_answers = request.session[quiz_number]
saved_answers[question_number] = answer
request.session[quiz_number] = saved_answers
Projektet
.get()
templates
models.py
<html>
views.pyurls.py
/quiz/1 def quiz()

Tjejer Kodar 100 - Dag 5 - Modeller & Golive

  • 1.
  • 2.
  • 3.
    Mål för idag •Förstå vad en databas är och hur den används • Förstå hur django hanterar formulärdata • Kunna använda sessionen för att lagra data • En sajt som är live!
  • 4.
    Tidsschema • 09.00 -10.00: Dagens presentation • 10.00 - 14.00: Dagens tutorial • 14.00 - 16.00: Golive (börja senast 14.00!) • 16.00 - 16.30: Samling och wrapup • 16.30 - 17.00: Visa för andra Tjejer kodar-deltagare
  • 5.
    Vad är endatabas? Land Mat Namn År 1 … … … … 2 … … … … 3 … … … … 4 … … … … Färg Vikt Vem När 1 … … … … 2 … … … … 3 … … … … 4 … … … …Tabell Tabell
  • 6.
  • 7.
    Inte magiska… Utdata IndataNamn År 1 … … … … 2 … … … … 3 … … … … 4 … … … … Färg Vikt Vem När 1 … … … … 2 … … … … 3 … … … … 4 … … … …
  • 8.
    SQL?! SELECT COUNT(id) FROMuser WHERE reg_date > "2000-01-01" SELECT username FROM user WHERE username LIKE "emil%"
  • 9.
    models.py class Quiz(models.Model): quiz_number =models.PositiveIntegerField() name = models.CharField(max_length=100) description = models.TextField()
  • 10.
    Vår Quiz-Model id quiz_numbername description 1 1 Klassiska böcker Hur bra kan… 2 2 Största fotbollslagen Kan du dina lag? 3 3 Mest kända hackare Hackerhistoria är… 4 … … …
  • 11.
    Hur använder jagmin Quiz-modell? from quiz.models import Quiz quizzes = Quiz.objects.all() SELECT * from quiz_quiz quizzes = [quiz1, quiz2, quiz3] quizzes[0].name ”Klassiska böcker”
  • 12.
    Vad mer kanvi göra? • Skapa data: • Quiz.objects.create(quiz_number=4, name=”Min quiz”, description=”Här är min quiz”) • Hämta ut data: • Quiz.objects.filter(quiz_number__gt=3).count() • Quiz.objects.filter(name__startswith=”Klassiska”) • Quiz.objects.get(quiz_number=”1”)
  • 13.
    Vad mer kanvi göra? • Uppdatera data: • quiz = Quiz.objects.get(quiz_number=”1”) • quiz.name = “Starwars-quizzen” • quiz.save() • Ta bort data: • Quiz.objects.filter(name__contains=”test”).delete()
  • 14.
    models.py class Question(models.Model): question =models.TextField() answer1 = models.CharField(max_length=100) answer2 = models.CharField(max_length=100) answer3 = models.CharField(max_length=100) correct = models.PositiveIntegerField() quiz = models.ForeignKey(Quiz)
  • 15.
    Vår Question-model id questionanswer1 answer2 answer3 correct quiz_id 1 Hur många bultar har… 12 123 1234 2 1 2 Välj ett datum 1 jan 10 feb 29 maj 3 1 3 … … … … … … 4 … … … … … …
  • 16.
    Migrations • python manage.pymakemigrations • Migrations for 'quiz': 0001_initial.py: - Create model Question - Create model Quiz - Add field quiz to question • python manage.py migrate
  • 17.
  • 18.
    Formulär <form action="/min-sida/"> <input type="radio"name="year" value=”2015"> 2015 <input type="radio" name="year" value="2016"> 2016 <input type="radio" name="year" value="2017"> 2017 <button type="submit">Next</button> </form> Data som skickas: year=2017
  • 19.
    Standardval <form action="/min-sida/"> <input type="radio"name="year" value=”2015" checked> 2015 <input type="radio" name="year" value="2016"> 2016 <input type="radio" name="year" value="2017"> 2017 <button type="submit">Next</button> </form> Data som skickas: year=2017
  • 20.
    Hantera formulärdata def answer(request): year= request.POST["year"] return HttpResponse("Du skickade med " + year)
  • 21.
    Hur spara svaren? •Behöver bara vara temporärt, onödigt med databas • En vanlig variabel fungerar inte, när man laddar om sidan så nollställs allt… • Lösning: Sessionen!
  • 22.
    Sessionen saved_answers = { "1":2, "2": 3, "3": 3, "4": 1, } saved_answers["5"] = 1 saved_answers = { "1": 2, "2": 3, "3": 3, "4": 1, "5": 1, }
  • 23.
    Sessionen def answer(request, quiz_number,question_number): saved_answers = request.session[quiz_number] saved_answers[question_number] = answer request.session[quiz_number] = saved_answers
  • 24.

Editor's Notes

  • #3 Projekt URL:er Views Templates Modeller
  • #4 14.00 är hård deadline, jag vill att ni börjar på Golive-tutorialen senast då
  • #5 14.00 är hård deadline, jag vill att ni börjar på Golive-tutorialen senast då
  • #6 Likt en samling excelblad Varje excel-blad kallas för en databas-tabell, och en samling tabeller kallas för en databas Brukar använda denna ikon för att symbolisera en databas
  • #7 Inte gjorda för att titta i manuellt, istället kopplar program upp sig mot dem och ställer frågor I användartabellen: “Hur många användare har vi just nu?” I produkttabellen: “Hämta priset på produkten med id=52” Det typen vi använder, en relationsdatabas, klarar av att slå ihop data från flera tabeller och leverera data “Ge mig en lista på alla användare som köpt produkten med id=52” Extremt snabba även med miljoner rader data Klarar att flera användare skriver och läser från databasen parallellt
  • #8 Ingen magi alls, all data hamnar i en fil på hårddisken som man göra vad man vill med Ett program som kör på din egen dator med din databas i, ditt program kopplar upp sig mot den Alternativ: En server på internet som kör databasprogrammet, och som man kopplar upp sig mot Medan vi bygger vår prototyp så kommer vi jobba mot en databas som bara kör på er egen dator (Ni kommer skriva in era quizzes två ggr!) Sen IGEN när ni går live!
  • #9 DELETE, UPDATE, INSERT, … Väldigt populärt, och fungerar oavsett programmeringsspråk och mot flera olika databas-produkter Men: Om man skriver SQL manuellt är det lätt att missa ett tecken någonstans I värsta fall så tar man bort en hel databas (det har jag gjort i ett kundprojekt, som tur var hade vi backup vi kunde återställa från)
  • #10 Detta i vår quiz/models.py PositiveIntegerField för när man ska lagra en siffra CharField för alla korta textfält (< 256 tecken) TextField för när man kan behöva fler tecken än så Optimering -> Ju mindre fält, desto snabbare svar på frågorna.
  • #11 Django genererar då följande databas åt oss. Djangos modeller ska vi använda för att spara data för vår frågesport, men egentligen skulle vi kunna spara precis vilken data som helst Jag brukar börja ett projekt med att fundera över vilka modeller jag kommer att behöva, och sen bygga projektet runt detta. Så låt oss göra det för quiz-projektet
  • #14 Men vi har ju questions också?
  • #15 Detta i vår quiz/models.py Väldigt likt Quiz… TextField, CharField, PositiveIntegerField ForeignKey: Varje fråga håller koll på vilken av era quiz den hör till!
  • #16 quiz_id, varje fråga behöver veta vilken quiz den hör till!
  • #17 Migrations: Hur får jag med mina databasändringar till de andra utvecklarna? Om man vill se till att varje quiz har en bild också: Lägg till det fältet i models.py makemigrations migrate Checka in i Git så de andra utvecklarna kan få samma fil
  • #18 Nu har vi berättat hur våra modeller ser ut, vore det inte bra om Django själv kunde generera ett lite admingränssnitt? Då kunde vi lätt se att allt ser bra ut… Voilá!
  • #19 Exempel på ett typiskt formulär. När man klickar i en radioknapp så kommer bara data med för den knappen
  • #20 Gör att något alltid kommer att vara valt
  • #22 Sessionen: Sparas i en cookie hos användaren
  • #23 Ett sätt att lagra saker som stannar kvar över flera silladdningar Exempel: ”Spara hur många gånger någon har laddat om sidan”
  • #25 Projekt URL:er Views Templates Modeller