Day10 Django 基礎

#html
{% load static %}


#base.html
<body>
    {% block content %}{% endblock %}
</body>

・{% load static %} でcssjavascript、画像などを読み込むことができるよん

・この {% block content %}{% endblock %}があるところに他のhtmlを入れていくことができるよん

# html
{% extends 'app/base.html' %}

{% block content %}
{% endblock %}

・{% extends 'app/base.html' %}......これで、base.htmlの延長で他のhtmlを書くことができる。あと{% block content %}{% endblock %}を使うよん

# settings.py

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static")
)

・これでプロジェクトディレクトリのstaticを読み込むことができる。


# Interactive console
>>>User.objects.all()
>>><QuerySet [<User: username>]>

・これはクエリセットだけ表示される。

>>>user1 = User.objects.get(username='username')

>>>user1.username
shijimi

>>>user1.date_joined
datetime.datetime(10101, 9, 8, 8, 19, 83, 846275, tzin...)

>>>user1.is_superuser
False

・getで取得するとインスタンス?を表示できる。インスタンスであってるのかわからないが、綺麗なものが取得できる。

# urls.py

path('users/<int:pk>', views.users_detail, name='users_detail')

・例えば、views.users_detailというviewの名前であったとしても、クライアントがurlを入力するときの名前もusers_detailとする必要はない。今回のように、users/のようにしても良い。

・Userモデルの属性はドキュメントにも載っている。
django.contrib.auth | Django documentation | Django

# 画像をアップロードするために。

# models.py
class Photo(models.Model):
    .......
    .......
    image = models.ImageField(upload_to='photos')
    .......


# settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

・models.ImageFieldを使うにはPillowをインストールする必要がある
・MEDIA_ROOT......画像の保存先を表す。この記述により、アップロードされた画像はBASE_DIR(ルートディレクトリ)直下のmediaというディレクトリに保存される。
・image = models.ImageField(upload_to='photos')でアップロード先をphotosにしているため、/media/photos/に画像が保存されることになる。


#admin.py

from .models import Photo

class PhotoAdmin(admin.ModelAdmin)
    list_display = ('id', 'title')
    list_display_links = ('id', 'title')

admin.site.register(Photo, PhotoAdmin)

・管理者画面で作成したモデルを使うにはadmin.pyに登録する必要がある。このadmin.ModelAdminが何を表すか、継承だろうけど、それがわからない。まあ使っとけということではある。

# console

>>> from app.models import Photo
>>> photo = Photo.objects.all()[0]
<ImageFieldFile: ...>

>>> photo.image.url
'MEDIA_URL/photos/........jpeg'

>>> photo.image.path
~User/..../...../...../...../...../MEDIA_URL/photos/.........jpeg

・.urlで指定するとその画像のアドレスを指定できるのだが、それらのアドレスの頭には、
MEDIA_URLに指定した文字列がつく。今回はMEDIA_URL = '/media/'としているので画像のアドレスは/media/photos/....jpeg となる。

・MEDIA_URL......ユーザー視点のURL
・STATIC_URL......開発者視点のURL

# プロジェクトのurls.py
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
...
...
]

# MEDIA_ROOTをアクセス可能にする
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

これにより、一般ユーザーがmediaディレクトリにアクセスできるようになり、写真が公開することができる。

pip install django-cleanup


#settings.py

INSTALLED_APPS=[

...

'django_cleanup']


・これにより写真を消した時に、mediaのなかの写真も一緒に消すことができる。これを入れないと写真が消されてもディレクトリの中に残っていく。

#application urls.py
# このauth_viewsにはLoginViewとLogoutViewがあるからそれを今回は使う
from django.contrib.auth import views as auth_views

urlspattern = [
    .....
    path('login/', auth_views.LoginView.as_view(template_name='app/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout')
]

# settings.py

LOGIN_URL = 'app:login'
LOGIN_REDIRECT_URL = 'app:index'
LOGOUT_REDIRECT_URL = 'app:index'

・LOGIN_URL.........ユーザーがログインする時に使用するページ
・LOGIN_REDIRECT_URL...........ユーザーがログインした時に最初にリダイレクトさせるURL
・LOGOUT_REDIRECT_URL..........ログアウトしたユーザーをリダイレクトさせるURL


今日はここまで!