Python探索のModelFormコード詳細

6879 ワード

これは不思議なコンポーネントで、名前を通じて私たちは見ることができて、このコンポーネントの機能はmodelとformを組み合わせて、はい、あなたは間違いなく、自分の英語のレベルを信じています.
まず簡単な例を見てみましょう
例えば、私たちのデータベースにはこのような学生表があります.フィールドには名前、年齢、趣味、メールボックス、電話、住所、登録時間などの情報がたくさんあります.今、学生を作成するページを書かせます.バックグラウンドはどう書きますか.
まず、フロントエンドにこれらのフィールドを羅列し、ユーザーに記入させます.その後、あさってからユーザーの入力を受信し、新しい学生オブジェクトを作成し、保存します.
実は、重点はこれらではなく、合法性の検証で、私たちはフロントエンドでユーザーの入力が合法かどうかを判断する必要があります.例えば、名前は何文字以内でなければなりませんか.電話番号は何桁の数字でなければなりませんか.メールボックスはメールボックスのフォーマットでなければなりません.
もちろん少しずつ手動で書くことができて、いろいろな判断、これは問題なくて、面倒を除いて
私たちは今もっと優雅な方法があります(後でPython関連の内容の中で、多く“優雅”という言葉を使って、そして習慣を身につけます)ModelForm
まず簡単に、硬いものを使って、検証条件を加えます.
まずModelFormをインポート

from django.forms import ModelForm

ビュー関数では、StudentListというクラスを定義します.このクラスはModelFormを継承し、このクラスに元のクラスMetaを書きます(書き方を規定し、頭文字が大文字であることに注意してください).
この元のクラスには、次の属性(部分)があります.

class StudentList(ModelForm):
  class Meta:
    model = models.Student #   Model   
    fields = "__all__"   #  ,   __all__,           
    exclude = None     #     
    labels = None      #    
    help_texts = None    #      
    widgets = None     #     
    error_messages = None  #       
#error_messages  :
    error_messages = {
      'name':{'required':"       ",},
      'age':{'required':"      ",},
    }
#widgets  ,         input   Textarea
#       
    from django.forms import widgets as wid #    ,      
    widgets = {
      "name":wid.Textarea(attrs={"class":"c1"}) #        
    }
#labels,           
    labels= {
      "name":"   "
    }

次にurl対応のビュー関数でこのクラスをインスタンス化し、このオブジェクトをフロントエンドに渡します.

def student(request):

  if request.method == 'GET':
    student_list = StudentList()
    return render(request,'student.html',{'student_list':student_list})

そしてフロントエンドは{student_list.as_p}}だけで、すべてのフィールドが出てきます.as_pはすべて表示されますが、forループというstudent_リスト、手に入れたのはinputボックスです.今はasを使いません.p、手動でこれらのinputボックスを出して、as_pが手に入れたページは醜い.
まずforループというstudent_Listは、studentオブジェクトを取得し、直接フロントエンドにこのstudentを印刷し、inputボックスstudentである.label、データベース内の各フィールドのverbose_を取得name、このプロパティを設定していない場合、デフォルトはフィールド名です.
studentを通過することもできます.errors.0エラーメッセージを取得
これらがあればbootstrapで、自分で欲しいスタイルをつづることができます.
例:


  

student

{% csrf_token %} {# {{ student_list.as_p }}#} {% for student in student_list %}
{# verbose_name, #}
{{ student }}
{% endfor %}

まだinputボックスのform-contralスタイルが欠けています.バックグラウンドのwidgetに追加することも考えられます.
たとえば、

from django.forms import widgets as wid #    ,      
    widgets = {
      "name":wid.TextInput(attrs={'class':'form-control'}),
      "age":wid.NumberInput(attrs={'class':'form-control'}),
      "email":wid.EmailInput(attrs={'class':'form-control'})
    }

もちろんjsで、すべてのinputボックスを見つけて、このスタイルを加えてもいいです.
データを保存するときは、一つ一つデータを取る必要はありません.saveだけが必要です.

def student(request):

  if request.method == 'GET':
    student_list = StudentList()
    return render(request,'student.html',{'student_list':student_list})
  else:
    student_list = StudentList(request.POST)
    if student_list.is_valid():
      student_list.save()
    return redirect(request,'student_list.html',{'student_list':student_list})

データの編集:
ModelFormを使わない場合は、編集時に前のデータを表示しなければならないでしょう.また、値を1回ずつ取らなければなりません.ModelFormの場合は、instance=obj(objは変更するデータベースのデータのオブジェクト)を1つ追加するだけで同じ効果が得られます.
保存するときは、必ずこのオブジェクト(instance=obj)があることに注意してください.そうしないと、どのデータを更新するか分かりません.
コードの例:

from django.shortcuts import render,HttpResponse,redirect
from django.forms import ModelForm
# Create your views here.
from app01 import models
def test(request):
  # model_form = models.Student
  model_form = models.Student.objects.all()
  return render(request,'test.html',{'model_form':model_form})

class StudentList(ModelForm):
  class Meta:
    model = models.Student #   Model   
    fields = "__all__"   #  ,   __all__,           
    exclude = None     #     
    labels = None      #    
    help_texts = None    #      
    widgets = None     #     
    error_messages = None  #       
#error_messages  :
    error_messages = {
      'name':{'required':"       ",},
      'age':{'required':"      ",},
    }
#widgets  ,         input   Textarea
#       
    from django.forms import widgets as wid #    ,      
    widgets = {
      "name":wid.Textarea
    }
#labels,           
    labels= {
      "name":"   "
    }
def student(request):
  if request.method == 'GET':
    student_list = StudentList()
    return render(request,'student.html',{'student_list':student_list})
  else:
    student_list = StudentList(request.POST)
    if student_list.is_valid():
      student_list.save()
    return render(request,'student.html',{'student_list':student_list})
def student_edit(request,pk):
  obj = models.Student.objects.filter(pk=pk).first()
  if not obj:
    return redirect('test')
  if request.method == "GET":
    student_list = StudentList(instance=obj)
    return render(request,'student_edit.html',{'student_list':student_list})
  else:
    student_list = StudentList(request.POST,instance=obj)
    if student_list.is_valid():
      student_list.save()
    return render(request,'student_edit.html',{'student_list':student_list})

まとめ
以上,Python探索のModelFormコードの詳細について述べたすべての内容であり,皆さんの役に立つことを願っている.興味のある方は引き続き当駅:pythonプログラミング羊ドア問題コード例、pythonにおけるrequests使用エージェントproxies方法紹介などを参照してください.不足点があれば、コメントを歓迎します.友达の本駅に対する支持に感谢します!