私はForm
を持っています。私はモデルを返す隠しフィールドを含める必要があります。私はそれをビューの価値に設定します。私はちょうどそれを次のページに一緒に掲示する必要があります。Djangoフォーム:隠しモデルフィールド?
フォームクラスではどのフィールドを使用しますか?
私はForm
を持っています。私はモデルを返す隠しフィールドを含める必要があります。私はそれをビューの価値に設定します。私はちょうどそれを次のページに一緒に掲示する必要があります。Djangoフォーム:隠しモデルフィールド?
フォームクラスではどのフィールドを使用しますか?
モデルを返す隠しフィールドですか?だからモデルインスタンス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
雄二の答えでのアプローチは、あなたが唯一のこれまでのあなたのコードベースに一度これをやっている場合は問題ありませフォーム上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())
は、それがモデルフィールドです... ForeignKey'が有効なフォームフィールドは '考えてはいけません。私はむしろ、整数ではなくモデルインスタンスを返すことにします( 'form.cleaned_data ['field']'で後で取得するとき) – mpen
ハハ、あなたは絶対に正しいです。それについてはごめんなさい... –
forms.MostWidgets ?利用可能なウィジェットのほとんどを意味しますか? – fanny