これは疑問な質問かもしれませんが、cleaned_dataを手動で設定するのが安全かどうかは少しは分かりません。ドキュメントsays:IS_VALID一度手動でDjangoでcleaned_dataを設定すると危険がありますか?
()はTrueを返し、あなたはそれがあなたのフォームで を定義された検証ルールに準拠していることを知識で安全なフォームの送信 を処理することができます。この ポイントで直接request.POSTにアクセスできますが、form.cleaned_dataにアクセスする方が良いでしょう。このデータは で検証されていませんが、関連する Pythonタイプにも変換されます。
さらに詳しくは、書籍のタイトル、書籍の著者、URLを要求するフィールドなどのフィールドがいくつかあるモデルフォームがあります。
フォームの条件は次のとおりです。urlフィールドが空の場合、ユーザーはタイトルと著者を指定する必要があります。 urlフィールドが与えられていれば、私は与えられたurlからhtmlを解析し、ユーザのためにタイトルと著者を自動的に抽出します。
URLからタイトルと著者を自動的に取得する場合、このデータをモデルに保存するための最良の方法は、フォームが作成者とタイトルの空のcleaned_dataを返すためです。解析されたデータが、モデルにある検証ルールに準拠することを確認しましたが、このようにcleaned_dataを設定することは疑わしいようです。 ModelFormクラスで
:
def save(self, commit = True, *args, **kwargs):
parsed_title = ... # String returned by my html parsing function
parsed_author = ... # String returned by my html parsing function
self.cleaned_data['title'] = parsed_title
self.cleaned_data['author'] = parsed_author
EDIT:
おかげで、私はそうのようにそれを作った:
def save(self, commit=True, *args, **kwargs):
instance = super(BookInfoForm, self).save(commit=commit, *args, **kwargs)
....
instance.title = parsed_title
instance.author = parsed_author
return instance
は、これは少しありますあなたは既に元の質問に答えているので、上記のコードは他の部分を壊しています。コンパイルされた情報をhttp://..../media/books/<id>
に保存する代わりに、<id>
がブックIDである場合は、http://..../media/books/None
に保存します。
私が追加と編集ハンドル私views.py
で追加/編集機能があります。
def insert_or_modify(request, id=None):
if id is not None:
book = BookModel.objects.get(pk=id)
else:
book = BookModel()
if request.method == 'POST':
form = BookInfoForm(request.POST, instance=book)
if form.is_valid():
form.save()
....
return render_to_response(...)
は私にid = Noneを取得していないないようにidが存在していることを確認する方法はありますか?私はもっと具体的には、modelformのsave()で、instance.id = Noneの場合、idを持つ新しいインスタンスを作成する方法があるのでしょうか?私はsuper(ModelForm、self).save(...)を呼び出すと私にとってそれができると思ったのですが?
おかげで再び!
おかげで、インスタンスを使用して、おそらく良いですが、今私はinstance.idが存在するかどうかをどのように扱うかについて少し困惑している(編集したポストを参照してください) – sharkfin