[django]ModelFormおよびインスタンス
16122 ワード
formとmodelの究極の結合.
Class Metaでよく使用されるパラメータ:
ModelFormの検証
通常のFormフォーム検証タイプと同様に、ModelFormフォームの検証はis_を呼び出しています.valid()またはerrorsプロパティにアクセスしたときに暗黙的に呼び出されます.
Formクラスのようにローカルフックメソッドとグローバルフックメソッドをカスタマイズして、カスタム検証ルールを実現できます.
特定のフィールドを書き換えずにvalidatorsプロパティを設定した場合、ModelFormはモデル内のフィールドのvalidatorsに従って検証されます.
save()メソッドはModelFormごとにsave()メソッドもあります.このメソッドは、フォームバインドされたデータに基づいてデータベース・オブジェクトを作成して保存します.ModelFormのサブクラスは、既存のモデルインスタンスをキーワードパラメータinstanceとして受け入れることができる.この機能が提供されている場合、save()はインスタンスを更新します.指定されていない場合、save()はモデルの新しいインスタンスを作成します.
例:form.py
views.py
html
class BookForm(forms.ModelForm):
class Meta:
model = models.Book
fields = "__all__"
labels = {
"title": " ",
"price": " "
}
widgets = {
"password": forms.widgets.PasswordInput(attrs={"class": "c1"}),
}
Class Metaでよく使用されるパラメータ:
model = models.Book # Model
fields = "__all__" # , __all__,
exclude = None #
labels = None #
help_texts = None #
widgets = None #
error_messages = None #
ModelFormの検証
通常のFormフォーム検証タイプと同様に、ModelFormフォームの検証はis_を呼び出しています.valid()またはerrorsプロパティにアクセスしたときに暗黙的に呼び出されます.
Formクラスのようにローカルフックメソッドとグローバルフックメソッドをカスタマイズして、カスタム検証ルールを実現できます.
特定のフィールドを書き換えずにvalidatorsプロパティを設定した場合、ModelFormはモデル内のフィールドのvalidatorsに従って検証されます.
save()メソッドはModelFormごとにsave()メソッドもあります.このメソッドは、フォームバインドされたデータに基づいてデータベース・オブジェクトを作成して保存します.ModelFormのサブクラスは、既存のモデルインスタンスをキーワードパラメータinstanceとして受け入れることができる.この機能が提供されている場合、save()はインスタンスを更新します.指定されていない場合、save()はモデルの新しいインスタンスを作成します.
>>> from myapp.models import Book
>>> from myapp.forms import BookForm
# POST form
>>> form_obj = BookForm(request.POST)
#
>>> new_ book = form_obj.save()
# form
>>> edit_obj = Book.objects.get(id=1)
# POST
>>> form_obj = BookForm(request.POST, instance=edit_obj)
>>> form_obj.save()
例:form.py
from django.forms import widgets as wid
class BookForm(ModelForm):
class Meta:
model=Book
fields="__all__"
labels={"title":" ", "price":" "}
widgets={
"title":wid.TextInput(attrs={"class":"form-control"}),
"price":wid.TextInput(attrs={"class":"form-control"}),
"date":wid.TextInput(attrs={"class":"form-control","type":"date"}),
"publish":wid.Select(attrs={"class":"form-control"}),
"authors":wid.SelectMultiple(attrs={"class":"form-control"}),
}
error_messages={
"title":{"required":" "}
}
views.py
def addbook(request):
if request.method=="POST":
form = BookForm(request.POST)
if form.is_valid():
form.save() # form.model.objects.create(request.POST)
return redirect("/books/")
else:
return render(request, "add.html", locals())
form=BookForm()
return render(request,"add.html",locals())
def editbook(request,edit_book_id):
edit_book = Book.objects.filter(pk=edit_book_id).first()
if request.method=="POST":
form = BookForm(request.POST,instance=edit_book)
if form.is_valid():
form.save() # edit_book.update(request.POST)
return redirect("/books/")
form=BookForm(instance=edit_book)
return render(request,"edit.html",locals())
html
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div>
{{ field.label }}
{{ field }} <span>{{ field.errors.0 }}span>
div>
{% endfor %}
<input type="submit">
form>