21. Render Data from the Database with a Model
(.venv) > $ python manage.py shell
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from products.models import Product
>>> Product.objects.get(id=1)
<Product: Product object (1)>
>>> obj = Product.objects.get(id=1)
>>> obj.title
'New product 1'
>>> obj.summary
'sweet'
products/views.py
:
from django.shortcuts import render
from .models import Product
def product_detail_view(request):
obj = Product.objects.get(id=1)
context = {
'object': obj
}
return render(request, "product/detail.html", context)
trydjango/urls.py
:
from products.views import product_detail_view
urlpatterns = [
# ...
path('product/', product_detail_view),
]
templates/product/detail.html
:
{% extends "base.html" %}
{% block content %}
<h1>{{ object.title }}</h1>
<p>
{% if object.description %}
{{ object.description }}
{% else %}
Coming Soon ...
{% endif %}
</p>
{% endblock %}
22. How Django Templates Load with Apps
mkdir -p /products/templates/products
mv templates/product/detail.html products/templates/products/product_detail.html
products/views.py
:
# ...
def product_detail_view(request):
obj = Product.objects.get(id=1)
context = {
'object': obj
}
return render(request, "products/product_detail.html", context)
23. Django Model Forms
products/forms.py
:
from django import forms
from .models import Product
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = [
'title', 'description', 'price'
]
products/templates/product_create.html
:
{% extends "base.html" %}
{% block content %}
<form method='POST'>
{% csrf_token %}
{{ form.as_p }}
<input type='submit' value='Save'/>
</form>
{% endblock %}
trydjango/urls.py
:
from products.views import product_create_view, product_detail_view
urlpatterns = [
# ...
path('create/', product_create_view),
]
products/views.py
:
# ...
from .forms import ProductForm
def product_create_view(request):
form = ProductForm(request.POST or None)
if form.is_valid():
form.save()
form = ProductForm()
context = {
"form": form
}
return render(request, "products/product_create.html", context)
24. Raw HTML Form
products/templates/product_create.html
:
{% extends "base.html" %}
{% block content %}
<form method='POST' action=".">
{% csrf_token %}
<input type="text" name="title" placeholder="Your title">
<input type='submit' value='Save'/>
</form>
{% endblock %}
products/views.py
:
def product_create_view(request):
if request.method == "POST":
my_new_title = request.POST.get('title')
print(my_new_title)
context = {}
return render(request, "products/product_create.html", context)
(.venv) > $ python manage.py runserver
System check identified no issues (0 silenced).
September 10, 2018 - 13:54:08
Django version 2.1.1, using settings 'trydjango.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[10/Sep/2018 13:54:09] "GET /create/ HTTP/1.1" 200 472
my title
[10/Sep/2018 13:55:55] "POST /create/ HTTP/1.1" 200 598
25. Pure Django Form
-
https://docs.djangoproject.com/en/2.1/ref/forms/fields/
products/forms.py
:
class RawProductForm(forms.Form):
title = forms.CharField()
description = forms.CharField()
price = forms.DecimalField()
products/views.py
:
# ...
from .forms import ProductForm, RawProductForm
def product_create_view(request):
my_form = RawProductForm()
if request.method == 'POST':
my_form = RawProductForm(request.POST)
if my_form.is_valid():
Product.objects.create(**my_form.cleaned_data)
else:
print(my_form.errors)
context = {"form": my_form}
return render(request, "products/product_create.html", context)
# ...
products/templates/product_create.html
:
{% extends "base.html" %}
{% block content %}
<form method='POST' action=".">
{% csrf_token %}
{{ form.as_p }}
<input type='submit' value='Save'/>
</form>
{% endblock %}
26. Form Widgets
products/forms.py
:
# ...
class RawProductForm(forms.Form):
title = forms.CharField(label="",
widget=forms.TextInput(attrs={
"placeholder": "Your title"}))
description = forms.CharField(required=False,
widget=forms.Textarea(attrs={
"placeholder": "Your description",
"class": "new-class-name two",
"id": "my-id-for-area",
"rows": 8,
"cols": 80
}))
price = forms.DecimalField(initial=199.99)
27. Form Validation Methods
products/forms.py
:
# ...
class ProductForm(forms.ModelForm):
title = forms.CharField(label="",
widget=forms.TextInput(attrs={
"placeholder": "Your title"}))
description = forms.CharField(required=False,
widget=forms.Textarea(attrs={
"placeholder": "Your description",
"class": "new-class-name two",
"id": "my-id-for-area",
"rows": 8,
"cols": 80
}))
price = forms.DecimalField(initial=199.99)
class Meta:
model = Product
fields = [
'title', 'description', 'price'
]
def clean_title(self, *args, **kwargs):
title = self.cleaned_data.get("title")
if not "CFE" in title:
raise forms.ValidationError("This is not a valid title")
if not "new" in title:
raise forms.ValidationError("This is not a valid title")
return title
# ...
products/views.py
:
# ...
def product_create_view(request):
form = ProductForm(request.POST or None)
if form.is_valid():
form.save()
form = ProductForm()
context = {"form": form}
return render(request, "products/product_create.html", context)
# ...
28. Initial Values for Forms
29. Dynamic URL Routing
products/views.py
:
# ...
def dynamic_lookup_view(request, my_id):
obj = Product.objects.get(id=my_id)
context = {
"object": obj
}
return render(request, "products/product_detail.html", context)
trydjango/urls.py
:
# ...
[
path('product/<int:my_id>/', dynamic_lookup_view, name="product"),
]
30. Handle DoesNotExist
products/views.py
:
from django.http import Http404
# ...
def dynamic_lookup_view(request, my_id):
try:
obj = Product.objects.get(id=my_id)
except Product.DoesNotExist:
raise Http404
context = {
"object": obj
}
return render(request, "products/product_detail.html", context)
网友评论