2011-06-22 14 views
1

私のモデルではオプションのURLFieldがあります。私はModelFormでもオプションにしました。問題は、フォームに絶対URLを生成させたいだけだということです。私はURLFieldが自動的にそうしていると思っていましたが、現在は私のために働いていません。Django - 絶対URLと相対URLの両方でURLFieldが発生する

問題を解決するために、私はモデルのsave()メソッドをオーバーライドすることに決めました。私はmodelformフィールドのclean_field()メソッドをオーバーライドしたいと思っていました。ただし、 "required = False"を指定してフォームフィールドにclean_fieldメソッドを設定することはできないように見えます。

def save(self,*args, **kwargs): 
     if self.url: 
      if not self.url.startswith('http://'): 
       self.url='http://' + self.url 
     super(Post, self).save(*args, **kwargs) 

ここに何か不足していますか?これは完全に受け入れられますか?

+1

オプションのフォームフィールドを検証できることは間違いありません。その部分はちょっと聞こえません。 –

+0

ここに遅れていますが、朝にコードを掲載します。私はclean_url()を削除したときに解決した問題を抱えていました。それがあると、フォームフィールドが突然必要となりました。削除すると、required = Falseに戻りました。少なくとも、そうするように見えました。 – Ben

答えて

1

モデルにurlというフィールドがあり、ModelFormでclean_url()メソッドを定義すると、オプションフィールドの有無にかかわらず、urlが存在するときに呼び出されます。 saveメソッドで妥当性検査を実行することで、ModelFormクラスの設計を壊してしまいます。 is_valid()の呼び出しが成功すると、検証は常に完了したものと見なすべきです。

しかし、それ以外にも、別の問題があります。

URLはscheme://host:port/absolute_pathと記載されています。絶対パスはURLにエンコードされますが、URL自体は単なる絶対パス以上のものです。

相対パスの問題は、相対的なものを判断することです。絶対パスは先行する '/'で始まり、常にサーバーまたはファイルシステムのルートからの相対パスです。相対パスは、現在アクティブなリソースとの相対パスです。ここでの問題は、現在のアクティブなリソースは何ですか?さらに、save()にこの情報を認識させ(したがって必要とする)ためには、確かにアーキテクチャが壊れています。

上記以外のコードでは、代替スキーム(https)が破られ、URLにホストが挿入されず、ルートからの相対パスではなく、相対的なものがわかります?

私はあなたが正しい戦略を持っていたと思います。相対パスではなく、絶対パスとURLの入力のみを許可します。 ModelFormで絶対パスを有効なURLに置き換えてください。これを行うには、ModelFormのclean()メソッドのdocumentationをもう一度見てください。問題がある場合は、その問題に固有の新しい質問を開きます。

+0

こんにちはベン、絶対パスとURLの区別は絶対に正しい。私は自分のユーザーがホスト名(stackoverflow.com、for example)を入力していると言って、この値をテンプレートのコンテキストとしてサイトのHTMLリンクに接続したいと明言する必要があります。ユーザーがプロトコルの挿入に失敗したとき、私は問題に直面しています(それは思われます)。 stackoverflow.comをコンテキスト変数としてレンダリングすると、それは私のサーバに相対的なものとして扱われます。私はその問題を修正できるテンプレートタグを認識していません。だから、ユーザーがプロトコルを省略すると、http://でURLフィールドのインスタンスをハードコードしたいと思う。 – Ben

+0

あなたは正しいです、私は有効なURLとabsosluteパスを置き換える必要があります。問題は、このインスタンスでclean()が失敗し、代替メソッドが大幅に悪化している(モデルの保存をオーバーライドする)かどうかです。この場合、clean()が本当に優れている理由はわかりません。あなたはその作品を説明できますか? – Ben

+0

その問題を具体的に扱う別の質問を開くことをお勧めします。それが機能していないことを伝えるエラーや出力情報を含めてください。 –

関連する問題