1

表形式のインラインフォームを使用して、管理者マスターの詳細があります。

達成する特別な検証がいくつかあります。

  1. 「field_type」が「list」の場合、フォームセットに少なくとも 1 つのアイテムが追加されていることを確認します。
  2. ただし、そうでない場合 (field_type に別の値がある場合)、検証は行われません。

「field_type」が「list」の場合はフォームセットを表示し、そうでない場合は非表示にします。これはジャバスクリプトです。また、サーバー上でそれを検証する必要があります。ValueItemInlineFormSet の clean() でそれを行います。問題は、フォームセットを常に検証していることであり、field_type = "list" の場合にのみ発生するはずです。マスター フィールドの値をフォームセットに取得するにはどうすればよいですか?

class ValueItemInlineFormSet(BaseInlineFormSet):

    def clean(self):
        """Check that at least one service has been entered."""
        super(ValueItemInlineFormSet, self).clean()
        if any(self.errors):
            return
        print(self.cleaned_data)
        if not any(cleaned_data and not cleaned_data.get('DELETE', False) for cleaned_data in self.cleaned_data):
            raise forms.ValidationError('At least one item required.')

class ValueItemInline(admin.TabularInline):
    model = ValueItem
    formset = ValueItemInlineFormSet

class MySelect(forms.Select):

    def render_option(self, selected_choices, option_value, option_label):
        if option_value is None:
            option_value = ''
        option_value = force_text(option_value)
        data_attrs = self.attrs['data_attrs']
        option_attrs = ''
        if data_attrs and option_value:
            obj = self.choices.queryset.get(id=option_value)
            for attr in data_attrs:
                attr_value = getattr(obj, attr)
                option_attrs += 'data-{}={} '.format(attr, attr_value)
        if option_value in selected_choices:
            selected_html = mark_safe(' selected="selected"')
            if not self.allow_multiple_selected:
                # Only allow for a single selection.
                selected_choices.remove(option_value)
        else:
            selected_html = ''
        return format_html('<option value="{}" {}{}>{}</option>', option_value, option_attrs, selected_html, force_text(option_label))

class RequirementFieldForm(forms.ModelForm):
    field_type = forms.ModelChoiceField(queryset=FieldType.objects.all(),
        widget=MySelect(attrs={'data_attrs': ('identifier', 'name')}))

    def __init__(self, *args, **kwargs):
        self.qs = FieldType.objects.all()
        super(RequirementFieldForm, self).__init__(*args, **kwargs)

    class Meta:
        model = RequirementField
        fields = ['field_type', 'name', 'description', 'identifier', 'mandatory', 'order_nr', 'active']
4

0 に答える 0