Django basics Flashcards
(38 cards)
Dlaczego warto używać web frameworka?
Web frameworki majątą zaletę,że oferują gotowe narzędzia. Np. nie ma potrzeby pisania pisać zapytań w języku SQL, aby skomunikować się z bazą relacyjną można to zrobić w języku Python. Web frameworki oferują również:
- automatyzowanie powtarzalnych zadań
- obsługiwanie żądań URL i narzędzia do mapowania URL
- automartczne generowanie templatów HTML
- narzędzia do zabezpieczenia sesji i obsługę ciasteczek
Jak stworzyć virtual environment w folderze z projektem?
tworzenie folderu z projektem
W terminalu wpisujemy kolejno:
$ pwd
$ ls -al
$ mkdir django-portfolio
$ ls -al
$ cd django-portfolio
tworzenie wirtualnego środowiska
$python3 -m venv .env
$ls -al
aktywacja wirtualnego środowiska
$ source .env/bin/activate
W PyCharmie po otwarciu projektu wybieram existing environment. A następnie w Preferences wybieram interpreter z pliku. Otwieram
sobie ścieżkę .env/bin/activate i tam wybieram plik ze strzałką do góry i ze znakiem zapytania o nazwie python 3
Komenda:
$django-admin startproject nazwaprojektu .
Dzięki tej komendzie django tworzy strukture folderów naszego nowego projektu
Tworzy się plik manage.py oraz folder o nazwie twojego projektu w którym znajdują siętakie pliki jak:
__init__.py
settings.py
urls.py
wsgi.py
The dot at the end of command avoids extra folders
Komenda:
$ python manage.py runserver
Starting development server at
http://127.0.0.1:8000
Komenda:
$ python manage.py startapp projects
Tworzymy nowąapkę wewnątrz istniejącego już projektu w Django*
*aby działała nasz serwer musi być włączony (poprzedzić $ python manage.py runserver)
settings.py
Plik zawierający ustawienia naszej aplikacji. Są tam określone ustawienia:
BASE_DIR
SECRET_KEY
DEBUG
ALLOWED_HOSTS
INSTALLED_APPS
MIDDLEWARE
ROOT_URLCONF
TEMPLATES
DATABASES
AUTH_PASSWORD_VALIDATORS
LANGUAGE_CODE
TIME_ZONE
STATIC_URL
STATICFILES_DIRS
DEFAULT_AUTO_FIELD
INSTALLED_APPS jak go używamy?
Każdą nowo-utworzoną apkę w moim projekcie Django muszę dodać do sekcji INSTALLED_APPS w settings.py
Jak dodać nowy URL (enpoint) mojej dodatkowej apki w Django?
do istniejących już urlpatterns dodaje swój nowy path:
W pliku urls.py głównego projektu używamy metody include()
e.g
from django.urls import include, path
urlpatterns = {
path(‘admin/’, admin.site.urls),
path(‘’, include(‘infos.urls’)),
]
Oprócz tego, że dodaliśmy ten url do urls.py głównej apki, to jeszcze musimy stworzyć plik urls.py w aplikacji której url chcemy dodać. Wiec Tworzę taki plik, w folderze z tą apką i tam definiuje odpowiednie url w klasyczny sposób (bez include i ):
urlpatterns = [
path(‘me/’, views.me),
path(‘contact/’, views.contact),
]
Jak dodać nowy URL (enpoint) mojej dodatkowej apki w Django?
do istniejących już urlpatterns dodaje swój nowy path:
W pliku urls.py głównego projektu używamy metody include()
e.g
from django.urls import include, path
urlpatterns = {
path(‘admin/’, admin.site.urls),
path(‘’, include(‘infos.urls’)),
]
Oprócz tego, że dodaliśmy ten url do urls.py głównej apki, to jeszcze musimy stworzyć plik urls.py w aplikacji której url chcemy dodać. Wiec Tworzę taki plik, w folderze z tą apką i tam definiuje odpowiednie url w klasyczny sposób (bez include i wskazujemy na views.py ):
from infos import views
urlpatterns = [
path(‘me/’, views.me),
path(‘contact/’, views.contact),
]
Jak stworzyć views.py?
trzeba zdefiniować metodę renderującą template HTML* w pliku views.py oraz podać request** jako argument
e.g
def me(request):
return render(request, “infos/me.html”)
from django.shortcuts import render
def contact(request):
return render(request, “infos/contact.html”)
- tym razem naszym Http Response object jest szablon HTML. Ale możemy też po prostu zaimportować HttpResponse z django.http i zwrócić pusta strone
e.g
from django.http import HttpResponse
def contact(request):
return HTTpResponse()***
**request - objekt django, który jest przekazywany ciągle gdzieś w apce
*** tutaj w ten nawias możemy wrzucić nawet całego HTMLa ukradzionego z jakiejś strony
Gdzie możemy zobaczyć Django errors?
1) w przeglądarce, szara strona z żółtym nagłówkiem
2) w terminalu: AttributeError
Jak stworzyć szablon HTML dla naszej apki i gdzie go umieścić ?
W folderze z naszą mniejszą apką (dla której szablon chcemy stworzyć) tworzymy folder o nazwie ‘templates’ i w nim kolejny folder ‘nazwa_naszej_apki’
Następnie tworzymy plik z rozszerzeniem HTML.
Lecz żeby nasza duża apka widziała ten folder ‘template’ musimy go zarejestrować w głównym pliku settings.py w zmiennej TEMPLATES = [ ‘DIRS’ : [] …
e.g
TEMPLATES = [
{
‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’,
‘DIRS’: [BASE_DIR / ‘templates’]
lub
‘DIRS’: [os.path.join(BASE_DIR, ‘projects/templates’)]
Zmiennna BASE_DIR w settings.py?
wskazuje nam na root naszego projektu
e.g
Jak uniknąć stylu raw HTML na naszej stronie?
Można wkleić link ze stylem CSS ze strony Bootstrap.
W HTMLu pod tittle:
<link></link>
Strona od razu wygląda lepiej
Do czego służy plik models.py?
Do komunikacji z bazą danych
SQL
SQL (ang. Structured Query Language) jest językiem zapytań, przy pomocy którego komunikujemy się z relacyjną bazą danych
Tabela w bazie danych jest reprezentowana w Django przez _____
klasę w models.py
class Project(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
Technology = models.Charfield(max_length=20)
image = models.Charfield(max_length=100))
każdy wiersz klasy odpowiada kolumnie tabeli w bazie. Nie ma id, bo jest generowane automatycznie. Podajemy również różne jakie typy danych maja sie znaleźć w tych polach.
python3 manage.p migrate
Gdzie zmieniamy bazę danych, z którą chcemy się połączyć?
settings.py
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.sqlite3’,
‘NAME’: BASE_DIR / ‘db.sqlite3’,
}
}
Po co używać Django shell?
Aby umieścić dane w bazie
Co wpisujemy w Django shell aby umieścić nasz projekt w bazie jako obiekt?
0) $ python3 manage.py shell
aby otworzyć powłokę django
1) Musimy mieć zdefiniowaną klasę (określającą tabelę) w models. py
2) W terminalu wpisujemy np.:
$ from projects*.models import Project**
*projects to. w naszym drzewie projektu folder z projektami
** Project to nazwa naszej klasy w której mamy zdefiniowane jak ma wyglądać tabela do bazy
3) następnie (nadal w terminalu) do jakiejś zmiennej (np. p1) wpisujemy dane zgodnie z formatką określoną przez klasę
$ p1= Project(title=”test project”, description=”this is a test, 1234!”, technology=”Django”, image=”testproject.png”)
4) aby zapisać dane w bazie
$ p1.save()
Jak zobaczyć, czy nasze dane się zapisały w bazie?
znowu użyjemy zmiennej np. p
$ results = Projects*.objects.all()
To query przypisaliśmy do zmiennej results, aby móc je wywołać:
$ results
Po wpisaniu tego dostajemy odpowiedź z bazy:
<Query Set [<Project: object (1)>]>
- Project to nazwa naszej klasy w której mamy zdefiniowane jak ma wyglądać tabela do bazy i z jej pomocą umieściliśmy dane w bazie, wpisując dane w odpowiednie pola
A jak chcemy np. tylko title wziąć to wpisujemy sobie indeks do zapytania:
p = results[0]
p.tittle
otrzymujemy:
“test project”
Pod nowym URL (dodaliśmy go do urls.py), chcemy dać HTML, do którego przekażemy nasz projekt (obiekt) z bazy. Jak zacząć to robić?
Musimy odpowiednio rozbudować metodę w views.py, która renderowała taki HTML
np.
def all_projects(request):
#query to the db to return all project objects
projects = Project.objects(all)
return render(request, ‘projects/all_projects.html’, {‘projects’: projects})
na końcu daję info że chce te dane z bazy przypisane do zmiennej projects wsadzić do słownika. Będziemy chcieli go wstrzyknąć do HTML. Jako, że nasze dane z bazy to wartość, a nasza zmienna projects to key tego słownika, to potem w HTMLu będzie wystarczyło podać klucz ‘projects’ jako variable:
….
<h1> hello again! </h1>
{{ projects }}
no ale wtedy nam się wyrintuje nasz Query w naszej stronie. Zobaczymy tam
hello again
<Query Set [<Project: object (1)>]>
Można więc to umieścić w logice, która wywołuje konkretne info z naszego słownika:
<h1> hello again! </h1>
{{ projects }}
{% for project in projects %}
<p> {{ project.title }} <p/>
<p> {{ project.description }} <p/>
<p> {{ project.technology }} <p/>
{% endfor %}*
- zamknięcie HTMLowe mojej pętli for
Teraz już wyświetli nam się coś sensowniejszego:
hello again
<Query Set [<Project: object (1)>]>
test project
this is a test 1234!
Django
Co jest przykładem użycia Django Templating Language, który pozwala nam wstrzykiwać dane do HTML?
{% code logic %}
{{ variables }}
w code logic dajemy np. jakąś pętlę
variables to właściwie print statement w template