django-admin startproject ct
### towrzymy i aktywujemy srodowisko
python3 -m venv ctdjango
source ctdjango/bin/activate
### tworzymy apke
python3 manage.py startapp first
### inne podstawowe operacje
python3 manage.py test
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsuperuser
### tworzymy model
class Nazwamodelu(models.Model):
nazwapola = models.CharField(max_length=128)
def __str__(self):
return self.name
### Pola w modelach
admin.py/
# wszystkie pola modelu sa widoczne
admin.site.register(Movie)
# wybieram pola modelu, ktore maja byc widoczne
@admin.register(Man)
class ManAdmin(admin.ModelAdmin):
fields = ('firstname', 'lastname') <- pola widoczne
list_display = ('firstname', 'lastname') <- pola na liscie
### Podkatalogi w serwisie
urls.py/
from django.urls import path, include <- dopisuje include
path('dupa/', include('first.urls')), <- first (nazwa), urls (plik urls.py)
# w aplikacji first
urls.py/
from django.urls import path
from .views import testowaodp
urlpatterns = [
path('xxx/', testowaodp),
]
views.py/
from django.http import HttpResponse
def testowaodp(request):
return HttpResponse('dkfjhskhfshdfkjh')
### statyczny html
settings.py/
w TEMPLATES
'DIRS': ['tmp']
tworzymy katalog tmp/ w korzeniu projektu
tam wrzucamy pliki html
views.py/
def statyczny(request):
return render(request, "st.html")
def zmienna(request):
zmienna = "dupa włochata"
return render(request,'st.html', { 'ddd': zmienna })
w pliku html {{ ddd }}
# przekazujemy liste
def zmienna(request):
zmienna = "dupa włochata od faceta"
lista = ['jeden','dwa','trzy']
return render(request,'st.html', { 'ddd': zmienna, 'lista': lista } )
w pliku html:
{% for item in lista %}
- {{ item }}
{% endfor %}
uzywanie if:
{% if warunek %}
kod html do wyswietlenia
{% endif %}
### pliki statyczne
w settings:
STATIC_URL = '/static/'
STATICFILES_DIRS = ['statyczne'] <- dopisujemy
lub w folderze apki katalog static
w pliku html:
{% load static %} <- na gorze
{% static 'jamnik.jpg' %} <- sciezka do pliku (jamnik.jpg to nazwa pliku)
### pliki media
MEDIA_URL = '/media/'
MEDIA_ROOT = 'mmm'
jesli chce wskazac podkatalog do uploadowania plikow
to w pliku models.py w danym modelu:
photo = models.ImageField(null=True, blank=True, upload_to='podkatalog')
### serwowanie plików graficznych w panelu admina
w glownym urls.py
from django.conf import settings
from django.conf.urls.static import static
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) <- po nawiasie kwadratowym
### wyciaganie danych z bazy
we views.py
from .models import Man
lista = Man.objects.all() <- mapuje do listy nazwy zwracane przez metode __str__(self) z klasy Man
lista = Man.objects.filter(id=4) <- mapuje tylko obiekt o id=4 ale dalej jest to array
lista = Man.objects.get(id=4) <- mapuje tylko obiekt o id=4 jako jeden obiekt
jesli chcemy inny element z klasy jak wskazany w __str__(self)
w kodzie item.nazwapola
### formularz dodawaia danych do bazy
tworzymy w aplikacji plik forms.py
from django.forms import ModelForm
from .models import Man
class ManForm(ModelForm):
class Meta:
model = Man
fields = ['firstname','lastname','yearofbirth','photo']
w urls.py dorzucamy:
path('add/', nowy), (dodajemy nowy do importu)
do pliku views.py dopisujemy:
from django.shortcuts import render, redirect <- dopisanie redirect-a
def nowy(request):
form = ManForm(request.POST or None, request.FILES or None)
if form.is_valid():
form.save()
return redirect(zmienna) <- zmienna to widok uruchamiany po dodaniu
return render(request, 'nowy.html', { 'form': form })
w bodu pliku nowy.html wrzucamy:
### edytowanie
urls.py
path('edit/', ed), (zaimportuj ed)
views.py
def ed(request, id):
ob = get_object_or_404(Man, pk=id)
form = ManForm(request.POST or None, request.FILES or None,
instance=ob)
if form.is_valid():
form.save()
return redirect(zmienna)
return render(request, 'nowy.html', { 'form': form })
### usuwanie
urls.py
path('delete/', rm), (import rm z views)
views.py
def rm(request, id):
ob = get_object_or_404(Man, pk=id)
if request.method == 'POST':
ob.delete()
return redirect(zmienna)
return render(request, 'potwierdz.html', {'ob': ob})
potwierdz.html
Czy napewno chcesz usunac {{ ob.firstname }} ?
### uzupelnienie listy o odnosniki do kasowania pozycji
w urls.py
path('edit/', ed, name = 'ed'),
w html-u:
wyswietlany odnosnik
###
Inne
Staff status - mozliwosc logowania sie do sekcji admin
###
Sekcja logowania dla zwyklych userow
urls.py
from django.contrib.auth import views as auth_views
path('zaloguj/', auth_views.LoginView.as_view()),
w lokalizacji na ktora wskazuje blad
(/tmp/registration/login.html)
### login logout normal user
urls.py
path('accounts/', include('django.contrib.auth.urls')),
# redirect after operations
settings.py
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'