0

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----------がデータベース内の値と一致させようとするため(検出されない)、エラーが発生します。

何か案は?

4

1 に答える 1

1

のメソッドを少しオーバーライドすることで、これを解決することができましたChoiceField

self.initialフォームにフィールドを追加し、 :で事前入力を処理しました。

class SchoolProductForm(forms.ModelForm):
    cip_category = common_forms.DynamicChoiceField(
        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)

        # Get the top parent and pre-populate
        if 'cip' in self.initial:
            self.initial['cip'] = models.CIP.objects.get(
                pk=self.initial['cip']).top_parent()

    class Meta:
        model = models.SchoolProduct
        exclude = ('campus',)

どこDynamicChoiceFieldにありますか:

class DynamicChoiceField(forms.ChoiceField):
    def valid_value(self, value):
        return True

次に、ビューでform_validオーバーライドに処理を追加しました。

def form_valid(self, form):
    self.object = form.save(commit=False)

    # Handle the CIP code
    self.object.cip_id = self.request.POST.get('cip_subcategory')
    if self.object.cip_id == '':
        self.object.cip_id = self.request.POST.get('cip_category')

    self.object.save()
于 2012-12-05T16:15:26.280 に答える