# Django Tutorial 2
### Speaker: Chih-Wei, Hsu

[About me](https://www.linkedin.com/in/kevin12686/)
---
# Class-Based Views
[More](https://docs.djangoproject.com/en/3.1/topics/class-based-views/)
---
# ListView
[More](https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-display/)
----
## blog/views.py
### Add
```python
from django.shortcuts import render
from django.views.generic import ListView #Add
from rest_framework.viewsets import ModelViewSet
...
class BlogList(ListView): #Add
model = Blog #Add
template_name = 'blogList.html' #Add
```
----
## blog/tamplates/blogList.html
### Add
```htmlembedded
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Blogs</title>
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
padding: 5px;
}
</style>
</head>
<body>
<table>
<thead>
<th>Title</th>
<th>Content</th>
<th>EditTime</th>
</thead>
<tbody>
{% for object in object_list %}
<tr>
<td>{{ object.title }}</td>
<td>{{ object.content }}</td>
<td>{{ object.editTime }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
```
----
## blog/urls.py
### Modify
```python
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import index, blogViewSet, BlogList # Modify
router = DefaultRouter()
router.register('blog', blogViewSet)
urlpatterns = [
path('', index, name='Index'),
path('blog/', BlogList.as_view(), name='BlogList'), # Add
path('api/', include(router.urls)),
]
```
----
[http://127.0.0.1:8000/blog/](http://127.0.0.1:8000/blog/)

----
## Git push
[Check Point 6](https://github.com/kevin12686/django_tutorial/tree/56086570494c261082631fdabe922137a10d51cf)
---
# CreateView
[More](https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-editing/)
----
## blog/views.py
### Add
```python
from django.shortcuts import render
from django.urls import reverse # Add
from django.views.generic import ListView, CreateView # Modify
...
class BlogCreate(CreateView): # Add
model = Blog # Add
fields = '__all__' # Add
template_name = 'form.html' # Add
def get_success_url(self): # Add
return reverse('BlogList') # Add
```
----
## blog/tamplates/form.html
### Add
```htmlembedded
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form</title>
</head>
<body>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
</body>
</html>
```
----
## blog/urls.py
### Modify
```python
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import index, blogViewSet, BlogList, BlogCreate # Modify
router = DefaultRouter()
router.register('blog', blogViewSet)
urlpatterns = [
path('', index, name='Index'),
path('blog/', BlogList.as_view(), name='BlogList'),
path('blog/create/', BlogCreate.as_view(), name='BlogCreate'), # Add
path('api/', include(router.urls)),
]
```
----
## blog/tamplates/blogList.html
### Add
```htmlembedded
...
<body>
<div style="margin: 10px 0px;"> # Add
<a href="{% url 'BlogCreate' %}"> # Add
<button>New Blog</button> # Add
</a> # Add
</div> # Add
...
```
----
[http://127.0.0.1:8000/blog/create/](http://127.0.0.1:8000/blog/create/)

----
## Git push
[Check Point 7](https://github.com/kevin12686/django_tutorial/tree/df6d29c4cf7b9df5bac59ca6a4ac50afedfc44bf)
---
# UpdateView
[More](https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-editing/)
----
## blog/views.py
### Add
```python
from django.shortcuts import render
from django.urls import reverse
from django.views.generic import ListView, CreateView, UpdateView # Modify
...
class BlogUpdate(UpdateView): # Add
model = Blog # Add
fields = '__all__' # Add
template_name = 'form.html' # Add
def get_success_url(self): # Add
return reverse('BlogList') # Add
```
----
## blog/urls.py
### Modify
```python
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import index, blogViewSet, BlogList, BlogCreate, BlogUpdate # Modify
router = DefaultRouter()
router.register('blog', blogViewSet)
urlpatterns = [
path('', index, name='Index'),
path('blog/', BlogList.as_view(), name='BlogList'),
path('blog/create/', BlogCreate.as_view(), name='BlogCreate'),
path('blog/update/<pk>/', BlogUpdate.as_view(), name='BlogUpdate'), # Add
path('api/', include(router.urls)),
]
```
----
## blog/tamplates/blogList.html
### Modify
```htmlembedded
...
{% for object in object_list %}
<tr>
<td><a href="{% url 'BlogUpdate' object.pk %}">{{ object.title }}</a></td> # Modify
<td>{{ object.content }}</td>
<td>{{ object.editTime }}</td>
</tr>
{% endfor %}
...
```
----
[http://127.0.0.1:8000/blog/](http://127.0.0.1:8000/blog/)

----
## Git push
[Check Point 8](https://github.com/kevin12686/django_tutorial/tree/01cb7d332d141dfe33ed7c7ed756e5188216ac06)
---
# Homework
* DetailView [(Link)](https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-display/)
* DeleteView [(Link)](https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-editing/)
---
# Authentication
[More](https://docs.djangoproject.com/en/3.1/topics/auth/)
----
# LoginView
----
## blog/urls.py
### Modify
```python
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from django.contrib.auth.views import LoginView # Add
...
urlpatterns = [
path('', index, name='Index'),
path('login/', LoginView.as_view(template_name='form.html'), name='Login'), # Add
path('blog/', BlogList.as_view(), name='BlogList'),
...
]
```
----
# LogoutView
----
## blog/urls.py
### Modify
```python
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from django.contrib.auth.views import LoginView, LogoutView # Modify
...
urlpatterns = [
path('', index, name='Index'),
path('login/', LoginView.as_view(template_name='form.html'), name='Login'),
path('logout/', LogoutView.as_view(), name='Logout'), # Add
path('blog/', BlogList.as_view(), name='BlogList'),
...
]
```
----
## blog/tamplates/blogList.html
### Add
```htmlembedded
<!DOCTYPE html>
...
<body>
{% if user.is_authenticated %} # Add
Hello, {{ user.username }} # Add
{% endif %} # Add
<div style="margin: 10px 0px;">
<a href="{% url 'BlogCreate' %}">
<button>New Blog</button>
</a>
<a href="{% url 'Logout' %}"> # Add
<button>Logout</button> # Add
</a> # Add
</div>
...
```
----
## backend/settings.py
### Add
```python
...
STATIC_URL = '/static/'
LOGIN_URL = '/login/' # Add
LOGIN_REDIRECT_URL = '/blog/' # Add
LOGOUT_REDIRECT_URL = '/login/' # Add
```
----
[http://127.0.0.1:8000/login/](http://127.0.0.1:8000/login/)

----
## Git push
[Check Point 9](https://github.com/kevin12686/django_tutorial/tree/4ffb2be2b73afbf46a1eeac099e679501c10af22)
---
# Permission Ristrict
[More](https://docs.djangoproject.com/en/3.1/topics/auth/default/)
----
## blog/views.py
### Modify
```python
from django.shortcuts import render
from django.urls import reverse
from django.contrib.auth.mixins import LoginRequiredMixin # Add
from django.views.generic import ListView, CreateView, UpdateView
from rest_framework.viewsets import ModelViewSet
...
class BlogCreate(LoginRequiredMixin, CreateView): # Modify
model = Blog
fields = '__all__'
template_name = 'form.html'
def get_success_url(self):
return reverse('BlogList')
class BlogUpdate(LoginRequiredMixin, UpdateView): # Modify
model = Blog
fields = '__all__'
template_name = 'form.html'
def get_success_url(self):
return reverse('BlogList')
```
----
## Git push
[Check Point 10](https://github.com/kevin12686/django_tutorial/tree/4ff75f8162b161230eefbcfd53d53be894d20d97)
---

[Github](https://github.com/kevin12686/django_tutorial)
---
<!-- .slide: data-background="https://i.imgur.com/VrcGp6z.png" -->
{"metaMigratedAt":"2023-06-15T12:02:56.066Z","metaMigratedFrom":"YAML","title":"Django Tutorial 2","breaks":true,"slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"34ea55f8-13ae-4abf-8a9c-bb0ea07272be\",\"add\":8925,\"del\":151}]"}