PythonのWebアプリケーションフレームワーク”Django”について無料で学習します。
今回は” CreateView “クラスについて学習します。
“CreateView”クラスは継承する事によってモデルクラスへデータを登録することができます。
準備
参考.Djang
※仮想環境”venv”にて進めます。
環境
環境 | version | 備考(コマンド) |
Rocky Linux | 8.4 | cat /etc/redhat-release |
Python | 3.6.8 | python -V |
Django | 3.2 | django-admin –version |
開発
urls
path("userTrade/create",views.UserCreate.as_view(), name="userTradeCreate"),
path('order/create/<int:pk>/',views.OrderCreate.as_view(), name='orderCreate')
orderPro/orderApp/urls.py
from django.urls import path
# view.pyをインポート
from . import views
# path(呼び出しアドレス, viewの呼び出す関数, path名)
urlpatterns = [
path("", views.Index.as_view(), name="index"),
path("userTrade/create",views.UserCreate.as_view(), name="userTradeCreate"), # ユーザー登録
path('order/create/<int:pk>/',views.OrderCreate.as_view(), name='orderCreate'), # 注文登録
]
views
CreateViewクラスを継承します。
models.orderItem, models.userTradeクラスを登録します。
model = models.orderItem
model = models.userTrade
formを登録します。
form_class = OrderCreateForm
form_class = UserCreateForm
orderPro/orderApp/views.py
from django.urls import reverse
from . import models
from .forms import UserCreateForm
# 注文登録
# 受注注文を登録する
class OrderCreate(CreateView):
# orderItemテーブル連携
model = models.orderItem
template_name = "AppHTML/order_create.html"
# form
form_class = OrderCreateForm
# 更新後のリダイレクト先
def get_success_url(self, **kwargs):
# 関数の中で解決する場合はreverse
self.targetUser = self.kwargs.get("pk")
return reverse("orderDetail", kwargs={"pk": self.targetUser})
# get時のpkを取得
# ユーザーDBからpkに該当するユーザー名を設定
def form_valid(self, form, **kwargs):
self.targetUser = self.kwargs.get("pk")
form.instance.userTrade = models.userTrade.objects.get(pk=self.targetUser)
return super().form_valid(form)
# ユーザー登録
class UserCreate(CreateView):
# Companyテーブル連携
model = models.userTrade
# テンプレートファイル連携
template_name = "AppHTML/user_create.html"
# form
form_class = UserCreateForm
# formへ渡す文字列設定(get_context_data)
# as.view()後に実行
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["name"] = "ユーザー名"
context["remarks"] = "備考"
return context
# 更新後のリダイレクト先
def get_success_url(self):
return reverse("index")
form
CreateViewクラスを継承します。
orderItem, userTradeクラスを登録します。
model = orderItem
model = userTrade
orderPro/orderApp/forms.py
from django import forms
from .models import userTrade
class OrderCreateForm(forms.ModelForm):
class Meta:
model = orderItem
fields = ( "deliveryDate"
,"deliveryDateSub"
,"supplier"
,"item"
,"size"
,"quantity"
,"purchasePrice"
,"sellingPrice"
,"profit"
,"remarks")
widgets = {
'deliveryDate': forms.DateInput(attrs={'type': 'date'}),
'deliveryDateSub': forms.DateInput(attrs={'type': 'date'}),
'supplier': forms.Select(attrs={
'class': 'form-control'
}),
'item': forms.Select(attrs={
'class': 'form-control'
}),
'size': forms.TextInput(attrs={
'class': 'form-control'
}),
'quantity': forms.TextInput(attrs={
'class': 'form-control'
}),
'purchasePrice': forms.TextInput(attrs={
'class': 'form-control'
}),
'sellingPrice': forms.TextInput(attrs={
'class': 'form-control'
}),
'profit': forms.TextInput(attrs={
'class': 'form-control'
}),
'remarks': forms.TextInput(attrs={
'class': 'form-control'
}),
}
labels = {
'deliveryDate':'納入日'
,'deliveryDateSub':'納入日(変更)'
,'supplier':'仕入先'
,'item':'商品'
,'size':'規格'
,'quantity':'数量'
,'purchasePrice':'仕入値'
,'sellingPrice':'売値'
,'profit':'利益'
,'remarks':'備考'
}
class UserCreateForm(forms.ModelForm):
class Meta:
model = userTrade
fields = ("name", "remarks")
widgets = {
"name": forms.TextInput(attrs={"class": "form-control"}),
"remarks": forms.TextInput(attrs={"class": "form-control"}),
}
labels = {
"name": "ユーザー名",
"remarks": "備考",
}
# formから値を取得(submit後に呼び出される)
def clean(self):
# 値を取得
data = super().clean()
name = data.get("name")
remarks = data.get("remarks")
# 文字数が0の場合
if len(name) == 0:
msg = "ユーザー名は0文字以上"
# エラーを表示
self.add_error("name", msg)
# 文字数が20以上の場合
if len(name) >= 20:
msg = "ユーザー名は20文字以下"
# エラーを表示
self.add_error("name", msg)
Template
formを表示
{{ form.as_p }}
orderPro/Template/AppHTML/user_create.html
{% extends "AppHTML/header.html" %}
{% block content_block %}
<h1>
{% if not form.instance.pk %}
ユーザー登録
{% else %}
ユーザー更新
{% endif %}
</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" class='btn btn-primary' value="実行">
</form>
{% endblock %}
order/Template/AppHTML/order_create.html
{% extends "AppHTML/header.html" %}
{% block content_block %}
<h1>
{% if not form.instance.pk %}
注文登録
{% else %}
注文更新
{% endif %}
</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" class='btn btn-primary' value="実行">
</form>
{% endblock %}