Python | プログラミング学習 Djang.[在庫管理] #04.04.02 CreateView

django004.04.02

PythonのWebアプリケーションフレームワーク”Django”について無料で学習します。
今回は” CreateView “クラスについて学習します。

“CreateView”クラスは継承する事によってモデルクラスへデータを登録することができます。

準備

※仮想環境”venv”にて進めます。

環境

環境version備考(コマンド)
Rocky Linux8.4cat /etc/redhat-release
Python3.6.8python -V
Django3.2django-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 %}

タイトルとURLをコピーしました