Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

Django modely

Nyní chceme vytvořit něco, co bude ukládat všechny příspěvky na našem blogu. Ale abychom to mohli udělat, musíme si nejdříve říct něco o objektech.

Objekty

V programování se používá koncept zvaný objektově orientované programování. Tato myšlenka předpokládá, že místo psaní všeho jako nudný sled programovacích instrukcí můžeme modelovat věci a definovat, jak komunikují mezi sebou navzájem.

Co tedy je objekt? Je to kolekce vlastností a činností. Zní to divně, ale dáme ti příklad.

Pokud chceme modelovat kočku vytvoříme objekt kočka, který má nějaké vlastnosti, například barva, věk, nálada (ta je dobrá, špatná, ospalá ;)), vlastník (který je objektem osoba nebo je možný případ zatoulané kočky, kde bude tato vlastnost prázdná).

Kočka má také některé akce: předení, škrábání nebo krmení (v němž dáváme kočce nějaké kočičí jídlo, které by mohlo být samostatný objekt s vlastnostmi, například chuť).

    Cat
    --------
    color
    age
    mood
    owner
    purr()
    scratch()
    feed(cat_food)


    CatFood
    --------
    taste

Základní představa je popsat skutečné věci v kódu vlastnostmi (nazývané vlastnosti objektu/object properties) a akcemi (nazývané metody/methods).

Jak tedy bude vypadat model blogu? Chceme vytvořit blog, ne?

Musíme odpovědět na otázku: Co je blog post/příspěvek? Jaké by měl mít vlastnosti?

Určitě budeme v naše blogu potřebovat nějaký text s jeho obsahem a titulkem, že? Bylo by také dobré vědět, kdo příspěvek napsal, takže potřebujeme autora. Nakonec také chceme vědět, kdy byl příspěvek vytvořen a publikován.

    Post
    --------
    title
    text
    author
    created_date
    published_date

Jaký druh věcí můžeme s příspěvkem dělat? Bylo by hezké mít nějakou metodu, která publikuje příspěvek, že ano?

Takže budeme potřebovat metodu publish.

Vzhledem k tomu, že už víme, co chceme dosáhnout, můžeme začít modelování v Django!

Django model

Nyní víme jaký objekt chceme vytvořit, tak můžeme přistoupit k tvorbě Django modelu pro náš příspěvek v blogu.

Model v Django je zvláštní druh objektu - který je uložen v databázi. Databáze je soubor dat. Je to místo, ve kterém budeš ukládat informace o uživatelích a tvých příspěvcích v blogu, atd. Budeme používat SQLite databázi k ukládání dat. To je výchozí databázový adaptér v Djangu – to nám bude nyní stačit.

Model v databázi si lze představit jako tabulku s řádky (data) a sloupci (údaje).

Vytvoření aplikace

Abychom udrželi pořádek, vytvoříme si samostatnou aplikaci uvnitř našeho projektu. Je velmi příjemné mít všechno zorganizované od samého začátku. Chceš-li vytvořit novou aplikaci, je třeba spustit následující příkaz v konzoli (z djangogirls adresáře, kde je manage.py soubor):

    (myvenv) ~/djangogirls$ python manage.py startapp blog

Zjistíš, že nový adresář blog nyní obsahuje řadu souborů. Adresáře a soubory v našem projektu by měl vypadat následovně:

    djangogirls
    ├── mysite
    |       __init__.py
    |       settings.py
    |       urls.py
    |       wsgi.py
    ├── manage.py
    └── blog
        ├── migrations
        |       __init__.py
        ├── __init__.py
        ├── admin.py
        ├── models.py
        ├── tests.py
        └── views.py

Po vytvoření aplikace musíš také Djangu říct, že by jí měl použít. Uděláme to v souboru mysite/settings.py. Musíme najít INSTALLED_APPS a přidat řádek, který bude obsahovat "blog", ). Takže konečná konfigurace by měla vypadat takto:

    INSTALLED_APPS = (
         'django.contrib.admin',
         'django.contrib.auth',
         'django.contrib.contenttypes',
         'django.contrib.sessions',
         'django.contrib.messages',
         'django.contrib.staticfiles',
         'blog',
    )

Vytvoření modelu pro blog post

V souboru blog/models.py budeme definovat všechny objekty nazývané modely - na tomto místě budeme definovat náš blog post.

Otevři blog/models.py, odstraň vše co v něm je a vlož následující kód:

    from django.db import models
    from django.utils import timezone


    class Post(models.Model):
        author = models.ForeignKey('auth.User')
        title = models.CharField(max_length=200)
        text = models.TextField()
        created_date = models.DateTimeField(
                default=timezone.now)
        published_date = models.DateTimeField(
                blank=True, null=True)

        def publish(self):
            self.published_date = timezone.now()
            self.save()

        def __str__(self):
            return self.title

Dvakrát si zkontroluj, že jsi použila dva znaky podtržítko(_) na každé straně str. Tato konvence se v Pythonu používá často. Někdy je také nazýváme "dunder" (zktratka pro "Double-UNDERscore").

Vypadá to děsivě, že? Ale žádný strach vysvětlíme, co tyto řádky znamenají!

Všechny řádky začínající from nebo import jsou řádky, které přidávají některé kousky z jiných souborů. Takže namísto kopírování a vkládání stejných věcí v každém souboru, můžeš zahrnout některé části s from... import....

class Post(models.Model):-Tento řádek definuje náš model (Jedná se o objekt).

  • class je speciální klíčové slovo, které říká, že definujeme objekt.
  • Post je jméno našeho modelu, můžeme mu dát jiné jméno (ale musíme se vyvarovat speciálních znaků a bílých míst). Název třídy vždy začínej velkým písmenem.
  • models. Model znamená, že Post je Django Model, takže Django ví, že by to mělo být uloženo v databázi.

Nyní definujeme vlastnosti, mluvili jsme o: title, text, created_date, published_date a autor. To uděláš tak, že definuješ typ každého pole (Je to text? Číslo? Datum? Vztah k jinému objektu, například uživateli?).

  • models. CharField-takto definuješ text s omezeným počtem znaků.
  • models. TextField-toto použiješ na dlouhý text bez omezení. To zní ideálně pro obsah blog post, ne?
  • models. DateTimeField-definuje datum a čas.
  • models. ForeignKey-definuje odkaz do jiného modelu.

Nebudeme vysvětlovat každý kousek kódu, vzhledem k tomu, že by trvalo příliš dlouho. Měla bys se podívat do Django dokumentace, pokud se chceš dozvědět víc o polích modelu a jak definovat jiné věci než výše uvedené (https://docs.djangoproject.com/en/1.8/ref/models/fields/#field-types).

Co je def publish(self):? Je to publish metoda, o které jsme mluvili dříve. def znamená, že definuješ funkci/metodu, a publish je název metody. Název metody můžeš změnit, pokud chceš. Pravidlo pro pojmenovávání je, že používáme malá písmena a podtržítka místo mezer. Například metoda, která vypočítá průměrnou cenu se bude jmenovat calculate_average_price.

Metody často něco vrací/return. Zde je příklad metoda __str__. V tomto případě když zavoláme metodu __str__() dostaneme text (řetězec/string) s názvem Postu.

Pokud ti něco stále ještě není jasné o modelech, neváhej se zeptat svého kouče! Víme, že je to složité, zvláště, když se dozvíte, co jsou objekty a funkce takto naráz. Doufejme, že to je nyní pro tebe trochu méně magické!

Vytvoření tabulek pro modely v databázi

V posledním kroku přidáš náš nový model do databáze. Nejprve musíme dát Djangu vědět, že mám nějaké změny v modelu (které jsme právě vytvořili!). Napiš Python manage.py makemigrations blog. Celý příkaz bude vypadat takto:

    (myvenv) ~/djangogirls$ python manage.py makemigrations blog
    Migrations for 'blog':
      0001_initial.py:
      - Create model Post

Django pro nás připravil soubor migrace, který budeme muset aplikovat na naší databázi. Napiš Python manage.py migrate blog a výstup by měl vypadat takto:

    (myvenv) ~/djangogirls$ python manage.py migrate blog
    Operations to perform:
      Apply all migrations: blog
    Running migrations:
      Rendering model states... DONE
      Applying blog.0001_initial... OK

Hurá! Náš Post model je nyní v naší databázi! Bylo by hezké vidět ho v akci, že ano? Přeskoč na další kapitolu a koukni jak vypadá tvůj příspěvek!