30. 呼び出すと
first middlewqre before view
second middlewqre before view
django.core.handlers.BaseHandler._get_response: r
first middlewqre process_view
second middlewqre process_view
IndexView: get
second middlewqre process_template_response
first middlewqre process_template_response
second middlewqre after view
first middlewqre after view
33. ModelForm
>>> from blog.models import Entry
>>> from django.forms import ModelForm
>>> class EntryForm(ModelForm):
... class Meta:
... model = Entry
... excludes = ['created']
>>>
>>> form = EntryForm(dict(slug='test3', title='MF'))
>>> form.is_valid()
False
>>> form.errors
{'released': ['This field is required.'], 'author': ['This field is
required.’]}
35. manage.py shellで遊ぶ
$ python manage.py shell
>>> from blog.models import Entry
>>> from django.contrib.auth import get_user_model
>>> me =
get_user_model().objects.filter(email='mtsuyuki@gmail.com')[
0]
>>> me
<User: makoto>
36. manage.py shellで遊ぶ
>>> entry = Entry(slug='test', title='北海道へ来ました!',
author=me)
>>> entry.save()
/Users/makoto/venv/hokkaido/lib/python3.6/site-
packages/django/db/models/fields/__init__.py:1451:
RuntimeWarning: DateTimeField Entry.released
received a naive datetime (2017-11-05
17:55:34.238327) while time zone support is active.
RuntimeWarning)
37. manage.py shellで遊ぶ
>>> for entry in Entry.objects.all():
... print(f'{entry.pk} {entry.slug}: {entry.title} by
{entry.author.username}')
...
1 test: 北海道へ来ました! by makoto
51. Inheritance - abstract
from django.db import models
class CommonInfo(models.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()
class Meta:
abstract = True
class Student(CommonInfo):
home_group = models.CharField(max_length=5)
https://docs.djangoproject.com/en/1.11/topics/db/models/#abstract-base-classes
Id
name
age
home_group
52. Inheritance - separate
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs =
models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
https://docs.djangoproject.com/en/1.11/topics/db/models/#multi-table-inheritance
id
name
address
place_ptr_id
serves_hot_dogs
serves_pizza
1to1
65. View - function based
import datetime
from django.http import HttpResponse
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
https://docs.djangoproject.com/en/1.11/topics/http/views/
66. View - class based
from django.views.generic.base import View
from django.http import HttpResponse
class IndexView(View):
def dispatch(self, request, year=None, month=None):
html = f'<html><body>{year}/{month}</body></html>'
return HttpResponse(html)
https://docs.djangoproject.com/en/1.11/topics/http/views/
67. View - class based
from django.views.generic.base import View
from django.http import HttpResponse
class IndexView(View):
def dispatch(self, request, year=None, month=None):
html = f'<html><body>{year}/{month}</body></html>'
return HttpResponse(html)
https://docs.djangoproject.com/en/1.11/topics/http/views/
rticles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', IndexView.as_v
68. View - class based
get
post
put
patch
https://docs.djangoproject.com/en/1.11/ref/class-based-views/base/#view
delete
head
options
trace
69. View - idiom
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import MyForm
def myview(request):
if request.method == "POST":
form = MyForm(request.POST)
if form.is_valid():
# <process form cleaned data>
return HttpResponseRedirect('/success/')
else:
form = MyForm(initial={'key': 'value'})
return render(request, 'form_template.html', {'form': form})
https://docs.djangoproject.com/en/1.11/topics/class-based-views/intro/#handling-forms-with-class-based-views
72. TemplateView
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
>[0-9]{4})/(?P<month>[0-9]{2})/$', TemplateView.as_view(templat
73. Generic display views
DetailView
ListView
from django.views.generic.list import ListView
from articles.models import Article
class ArticleListView(ListView):
model = Article
https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-display/
74. Generic editing views
FormView / CreateView / UpdateView / DeleteView
https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-editing/
from django.views.generic.edit import CreateView
from myapp.models import Author
class AuthorCreate(CreateView):
model = Author
fields = ['name']