Django Basic - Part 2
Model
Django can have ORM (Object Relational DB) and sql.
models.py
dir - homepage/models.py:
class Coffee(models.Model):
    """
    types are
    string: CharField
    number: IntergerField, SmallIntegerField, ...
    logic: BooleanField
    time/date: DateTimeField
    ...
    """
    name = models.CharField(default="",max_length=30) # null=False(default): must have value
    price = models.IntegerField(default=0)
    is_ice = models.BooleanField(default=False)
admin.py
If register admin in django app, we can manage db in admin page.
admin.py:
from django.contrib import admin
from .models import Coffee
# Register your models here.
admin.site.register(Coffee)
result:

Groups, Users are also models as default when creating superuser
Migration
To let django know model infomation:
makemigration(notice to django about changes of models) -> migrate(save changes)
makemigrations == git add  
migrate == git commit  
- makemigrations
    
$ python manage.py makemigrations homepageresult:

 - migrate
    
$ python manage.py migrateresult:

result of page:

 
Display classβs attribute
added two objects in coffee:
result:

Display class object as its attribute(name):
##### models.py #####
class Coffee(models.Model):
    def __str__(self):
        return self.name
    name = models.CharField(default="",max_length=30) # null=False(default): must have value
    price = models.IntegerField(default=0)
    is_ice = models.BooleanField(default=False)
result:

coffe page view
- 
    
Add coffee_view to views.py
homepage/views.py:
from django.shortcuts import HttpResponse, render from .models import Coffee # import Coffee class ... def coffee_view(request): coffee_all = Coffee.objects.all() # all, get, filter, ... return render(request, 'coffee.html', {"coffee_list":coffee_all}) - 
    
Make Coffe Template
homepage/template/coffee.html:
<!DOCTYPE html> <html> <head> <title>Coffee List</title> </head> <body> <h1>My Coffee List</h1> <p>{{coffee_list}}</p> </body> </html> - 
    
Add urls.py in webproj/urls.py
from django.contrib import admin from django.urls import path from homepage.views import index, coffee_view urlpatterns = [ path('', index), # localhost/ path('admin/', admin.site.urls), # localhost/admin path('coffee/', coffee_view), # localhost/coffee ]result:

 - 
    
Display as Objectsβ attributes.
<!DOCTYPE html> <html> <head> <title>Coffee List</title> </head> <body> <h1>My Coffee List</h1> {% for coffee in coffee_list %} <p>{{coffee.name}}, {{coffee.price}}</p> {% endfor %} </body> </html>result:

 
Summary
Process
- Make a model (ORM) in homepage/models.py
 - Register Admin User of the model in homepage/admin.py
 - Do Migration (makemigrations(git add), migrate(git commit))
 - Make a template in template/your.html
 - Make a view in homepage/views.py (input: template-html, data-models class)
 - Add a url in /urls.py
 
Form
homepage/forms.py:
Make forms.py
from django import forms
from .models import Coffee
# forms.ModelForm
class CoffeeForm(forms.ModelForm): # ModelFormμ μμλ°λ CoffeForm μμ±
    class Meta:
        model = Coffee # model
        fields = ('name', 'price', 'is_ice') # name, price, is_ice
Add to views.py
from django.shortcuts import HttpResponse, render
from .models import Coffee
from .forms import CoffeeForm
...
def coffee_view(request):
    coffee_all = Coffee.objects.all() # all, get, filter, ...
    form = CoffeeForm()
    return render(request, 'coffee.html', {"coffee_list":coffee_all, "coffee_form":form})
Modify Template
Without Submit(save) Button
coffee.html:
    <body>
        <h1>My Coffee List</h1>
        {% for coffee in coffee_list %}
            <p>{{coffee.name}}, {{coffee.price}}</p>
        {% endfor%}
        <form action="">
            {{ coffee_form.as_p}} <!-- as_p: as paragraph -->
        </form>
    </body>
result:

Add Save Button
    <body>
        <h1>My Coffee List</h1>
        {% for coffee in coffee_list %}
            <p>{{coffee.name}}, {{coffee.price}}</p>
        {% endfor%}
        <form action="" method="POST">
            {{ coffee_form.as_p}} <!-- as_p: as paragraph -->
            <button type="submit">Save</button>
        </form>
    </body>
result:

Form needs Verification
After push save button:

To solve this,
Add CSRF Token:
    <body>
        <h1>My Coffee List</h1>
        {% for coffee in coffee_list %}
            <p>{{coffee.name}}, {{coffee.price}}</p>
        {% endfor%}
        <form action="" method="POST">{% csrf_token %}
            {{ coffee_form.as_p}} <!-- as_p: as paragraph -->
            <button type="submit">Save</button>
        </form>
    </body>
To get information from the page as βSaveβ Button,
Modify views.py.
def coffee_view(request):
    coffee_all = Coffee.objects.all() # all, get, filter, ...
    # if request is POST
        # Complete Form by POST
        # If valid, save it.
    if request.method=="POST":
        form  = CoffeeForm(request.POST)
        if form.is_valid(): #
            form.save()
    
    form = CoffeeForm()
    return render(request, 'coffee.html', {"coffee_list":coffee_all, "coffee_form":form})
result:

      
    
Leave a comment