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の値を格納するのは出来るみたい。