[django]ModelFormおよびインスタンス

16122 ワード

formとmodelの究極の結合.
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>