2012-03-25 19 views
1

私は、 "作成日"のように編集してはならないいくつかのフィールドを持つモデルを持っています。余分な情報を含むテキストフィールドを含むフォームを表示したいのですが、おそらくデータ自体は<span>にあります。人はいくつかのフィールドを編集することができます。同時に、このオブジェクトのデータベース内に作成された、最後に変更された、または関連するオブジェクトなど、モデルのインスタンスに関する追加情報を見ることができます。 Djangoのフレームワークを使ってこれを行う方法はありますか?あるいは、オブジェクト全体をテンプレートに渡して独自のカスタムフォームを作成する必要がありますか?余分な情報を持つDjangoフォーム

さらに詳しい説明が必要な場合は、お気軽にお問い合わせください。私は通常、次のように、読み取り専用にするウィジェットのために、フォームをカスタマイズすることを行うには

+0

どのようにフォームを作成していますか?モデルフォームのショートカットがあるかどうかはわかりませんが、Claudeの答えは私が知っている方法を示し、フォームクラスにMetaオブジェクトを設定しています。 – forivall

+0

私はModelFormとFormを使用しています。私は今日の両方の提案を考慮に入れて、私が思いつくことができるものを見ていきます。 – andermic

答えて

0

これを行うには、私が知っている最良の方法は、フォームまたはでinitial辞書を渡すことで、テンプレートにフォームを渡す前に、フィールドを初期化することですinstanceオブジェクトをフォームに渡します。

フィールドが無効になっていることを確認するか、フィールドを非表示にしてフィールドを通常のテキストとして表示する必要があります。

最も重要なことは、クライアントにデータを渡してフォームに戻す場合、データが入って来るのと同じであることを確認する必要があります(セキュリティのため)。フォームのclean_[field]機能でこれを行います。次のようになります。

class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
    def clean_date_created(self): 
     if self.cleaned_fields['date_created'] != self.instance.date_created: 
      raise ValidationError, 'date_created has been tampered' 
     self.cleaned_fields['date_created'] 

[編集/追記】あるいは、あなたが個別にレンダリングするテンプレートに直接データを渡すことができ、そして、あなたのビューに戻ってそれを取得した後、あなたのフォームにデータにタック。これは次のようになります:

def recieve_form(request, ...): 
    ... 
    f = MyForm(request.POST, instance=a) 
    new_model_instance = f.save(commit=False) 
    new_model_instance.date_created = <whatever> 
    new_model_instance.save() 
0

class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     widgets = { 
      'my_field': forms.TextInput(attrs={'disabled':'disabled'}), 
     } 

この意志出力読み取り専用のテキストフィールドが、私はあなたにも、ウィジェットを作成することができますねその意志だけを出力<div>または<p>(またはあなたが必要とするものは何でも)

関連する問題