# Django Tutorial 2 ### Speaker: Chih-Wei, Hsu ![](https://media-exp1.licdn.com/dms/image/C5103AQEOsP3dI7-KYw/profile-displayphoto-shrink_400_400/0?e=1602720000&v=beta&t=1ZgKSUY7ZCazSqIa-oQDw7fUyHTvIzSX2yYa6oeRsy4 =200x) [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/) ![](https://i.imgur.com/cBtKd5c.png) ---- ## 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/) ![](https://i.imgur.com/1VWz9OH.png) ---- ## 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/) ![](https://i.imgur.com/vOih5AH.png) ---- ## 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/) ![](https://i.imgur.com/9BAMYOg.png) ---- ## 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) --- ![](https://i.imgur.com/w83QWDE.png =300x) [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}]"}
    314 views