小梅の日記帳

覚書き、メモ、等々残していくつもりです。

ModelChoiceFieldについて

モデルから値を呼んでプルダウンに表示することを考えます。

まずはforms.pyを作成します。 ModelChoiceFieldを用います。 ここで、to_field_nameは返す値になります。

from django import forms

from . import models

class ProductForm(forms.Form):
  name = forms.ModelChoiceField(models.Product.objects, label='商品', to_field_name='code')

次に、models.pyになります。 普通に必要なモデルを作成します。

from django.db import models

class Product(models.Model):
    code = models.CharField('商品番号', max_length=30, unique=True)
    name = models.CharField('商品名', max_length=100)

    def __str__(self):
      return self.name

次に、views.pyです。 こちらは、クラスビューで作成しています。 その中でもFormViewというものを使っています。 POSTの操作が有る場合には、TemplateViewではなくFormViewを使用するとのこと。 どの部分がPOSTに対応しているのか、分からない。。。 バリデーションに関しては、form_valid関数を使うとのことです。

from django.views.generic import FormView
from tutorial_app.forms import ProductForm

class SampleFormView(FormView):
  form_class = ProductForm
  template_name = "tutorial_app/sample.html"

  def form_valid(self, form):
    return super().form_valid(form)

urls.pyです。 FormView等のようにクラスビューを用いると、as_view()の表記が必要となります。 path関数を使用するようにしました。

from tutorial_app.views import SampleFormView
from django.urls import path

urlpatterns = [
  #ここで、class_Viewを用いるときには、as_viewという表現を用いる。
  path(r'sample_template', SampleFormView.as_view()),
]

こちらが、admin.pyです。 管理画面でProductを追加していけるようにしました。

from django.contrib import admin
from tutorial_app.models import Product

admin.site.register(Product)

次に、抜粋ですが、settigs.pyのTEMPLATES部分です。 templatesディレクトリを切る場所をBASE_DIRで指定します。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
          os.path.join(BASE_DIR, 'templates'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

最後に、プロジェクトディレクトリ内のurlpatternsです。 特に変わったことはないですが、path関数を使用しました。

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('tutorial/', include('tutorial_app.urls')),
]

以上で結構簡単にプルダウンへDBの値を格納するのは出来るみたい。