Ubuntu12.10のPython2.7でDjango1.4を使用しています。
(jQueryを使用して)いくつかのドロップダウンを動的に入力する必要があるフォームがありますが、そのうちの2つは必須で、3つ目はオプションである必要があります。
私はTastypieを使用して、オプションを取得するためのAPIを支援しています。基本的に、最初のドロップダウンには、学校の業界レベルのコードが表示されます。コードを選択すると、そのコードのすべてのカテゴリにカテゴリドロップダウンが表示されます。カテゴリを選択すると、コードとカテゴリの組み合わせのすべてのサブカテゴリにサブカテゴリドロップダウンが表示されます。
コードドロップダウンを要求することができます(動的に入力されません)。ただし、カテゴリのドロップダウンが必要になるようにするのに苦労しています。基本的に、フロントエンド検証とバックエンド検証の2つのルートがあります。必要に応じてさらに検証を簡単に作成できるように、バックエンド検証を使用しようとしています。
フォームは次のとおりです。
class SchoolProductForm(forms.ModelForm):
cip_category = forms.ChoiceField(required=True,
choices=(('', '----------'),))
def __init__(self, *args, **kwargs):
super(SchoolProductForm, self).__init__(*args, **kwargs)
self.fields['short_description'].widget = TA_WIDGET
self.fields['salary_info'].widget = TA_WIDGET
self.fields['job_opportunities'].widget = TA_WIDGET
self.fields['related_careers'].widget = TA_WIDGET
self.fields['meta_keywords'].widget = TI_WIDGET
self.fields['meta_description'].widget = TI_WIDGET
self.fields['cip'].queryset = models.CIP.objects.filter(
parent_id__isnull=True)
class Meta:
model = models.SchoolProduct
exclude = ('campus',)
clean
メソッドをオーバーライドしようとしました。clean
フィールド固有のメソッドを作成しようとしました。どちらも機能していないようです。
次のバリエーション:
def clean(self):
super(SchoolProductForm, self).clean()
if cip_category in self._errors:
del self._errors['cip_category']
if self.cleaned_data['cip_category'] == '----------':
self._errors['cip_category'] = 'This field is required.'
return self.cleaned_data
cip_category
これにより、にがないというエラーが発生しますcleaned_data
。これは、検証されなかったため意味があります。
私はフィールド固有のクリーンでバリエーションを試しました:
def clean_cip_category(self):
data = self.cleaned_data['cip_category']
self.fields['cip_category'].choices = data
return data
しかし、私の選択が利用可能な選択肢の1つではないことを示す検証エラーがページに表示されます。
動的フィールドタイプ(いくつかのバリエーション)を作成しようとしました:
class DynamicChoiceField(forms.ChoiceField):
def valid_value(self, value):
return True
class SchoolProductForm(forms.ModelForm):
cip_category = DynamicChoiceField(required=True,
choices=(('', '----------'),))
しかし、それは有効なオプションとして受け入れ----------
(私は望まない)、ORM----------
がデータベース内の値と一致させようとするため(検出されない)、エラーが発生します。
何か案は?