2011-12-15 9 views
2

これは疑問な質問かもしれませんが、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(...)を呼び出すと私にとってそれができると思ったのですが?

おかげで再び!

答えて

4

存在する場合、あなたの意図は、cleaned_dataではなく、モデルデータを設定していることです。したがって、saveメソッドでcleaned_dataを設定する代わりに、属性をself.instanceに設定して保存するだけです。

手動でcleaned_dataを設定することについては、間違っているとは思わないので、クロスフィールド検証のためにフォームのクリーンメソッドで行うのが理にかなっています。

+0

おかげで、インスタンスを使用して、おそらく良いですが、今私はinstance.idが存在するかどうかをどのように扱うかについて少し困惑している(編集したポストを参照してください) – sharkfin

関連する問題