2011-01-14 18 views
17

私はFormを持っています。私はモデルを返す隠しフィールドを含める必要があります。私はそれをビューの価値に設定します。私はちょうどそれを次のページに一緒に掲示する必要があります。Djangoフォーム:隠しモデルフィールド?

フォームクラスではどのフィールドを使用しますか?

答えて

26

モデルを返す隠しフィールドですか?だからモデルインスタンスID?

forms.HiddenInputウィジェットがFKフィールドまたはCharFieldです上のあなたは、モデルのインスタンスIDを入れているかどうか、トリックを行う必要があります。

class MyForm(forms.Form): 
    hidden_2 = forms.CharField(widget=forms.HiddenInput()) 
    hidden_css = forms.CharField(widget=forms.MostWidgets(attrs={'style': 'display:none;'})) 

を私はこの作業を取得するための最速の方法を

class MyForm(forms.Form): 
    model_instance = forms.ModelChoiceField(queryset=MyModel.objects.all(), widget=forms.HiddenInput()) 

form = MyForm({'model_instance': '1'}) 
form.cleaned_data['model_instance'] 
されていると

しかし、私は、あなたが1つの項目をとにかく指定しようとしているなら、MyModel.objects.all()を提供するという考え方が好きではありません。

このような動作を避けるように思われる場合は、__init__という形式をより小さなQuerySetに上書きする必要があります。

私は昔ながらの方法を好むと思う:

class MyForm(forms.Form): 
    model_instance = forms.CharField(widget=forms.HiddenInput()) 

    def clean_model_instance(self): 
     data = self.cleaned_data['model_instance'] 
     if not data: 
      raise forms.ValidationError() 
     try: 
      instance = MyModel.objects.get(id=data) 
     except MyModel.DoesNotExist: 
      raise forms.ValidationError() 
     return instance 
+0

は、それがモデルフィールドです... ForeignKey'が有効なフォームフィールドは '考えてはいけません。私はむしろ、整数ではなくモデルインスタンスを返すことにします( 'form.cleaned_data ['field']'で後で取得するとき) – mpen

+0

ハハ、あなたは絶対に正しいです。それについてはごめんなさい... –

+0

forms.MostWidgets ?利用可能なウィジェットのほとんどを意味しますか? – fanny

2

雄二の答えでのアプローチは、あなたが唯一のこれまでのあなたのコードベースに一度これをやっている場合は問題ありませフォーム上clean_model_instanceメソッドを使用しています。より頻繁に行う場合は、カスタムモデルフィールドを実装することでメリットが得られます。

これは私が持っているコードです:

from django import forms 

class ModelField(forms.Field): 

    Model = None 

    def prepare_value(self, value): 
     """Inject entities' id value into the form's html data""" 
     if isinstance(value, self.Model): 
      return value.id 
     return value 

    def to_python(self, value): 
     """More or less stolen from ModelChoiceField.to_python""" 

     if value in self.empty_values: 
      return None 

     try: 
      value = self.Model.objects.get(id=value) 
     except (ValueError, self.Model.DoesNotExist): 
      raise forms.ValidationError('%s does not exist' 
             % self.Model.__class__.__name__.capitalize()) 

     return value 

あなたは基本クラスとしてそれを使用して、独自のモデルでそれを専門にした場合、それがベースに便利になります。たとえば:

# In app/fields.py 
from .models import CustomModel 

class CustomModelField(ModelField): 

    Model = CustomModel 

次にあなたが一度に必要なものは何でもウィジェットであることをペアリングすることができます

# in app/forms.py 
class MyForm(forms.Form): 

    hidden_custom_model_field = CustomModelField(widget=forms.HiddenInput()) 

    other_widget_custom_model_field = CustomModelField(widget=MyCustomWidget()) 
関連する問題