3

MyModelmptt のTreeForeignKeyフィールドがありますcategory。の管理者で、このフィールドのウィジェットのMyModelいくつかのオプションを無効にするにはどうすればよいですか?Selectcategory

ありがとうございます

class Category(MPTTModel):
    parent = TreeForeignKey('self', blank=True, null=True, related_name='children')
    nom = models.CharField(max_length=100)

class MyModel(models.Model):
    category = TreeForeignKey(Category)
    # more fields
4

1 に答える 1

10

MyModelAdminFormを上書きし、フィールドにSelectWithDisabledウィジェットを使用してforms.ChoiceFieldフィールドを使用する必要がありました。私の場合、木の葉だけを選択できるようにしたかったのです。category

class MyModelAdminForm(forms.ModelForm):

    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        self.level_indicator = kwargs.pop('level_indicator', u'---')
        super(MyModelAdminForm, self).__init__(*args, **kwargs)

        queryset = Category.objects.all()
        mptt_opts = queryset.model._mptt_meta
        queryset = queryset.order_by(mptt_opts.tree_id_attr, mptt_opts.left_attr)

        choices = []
        for item in queryset:
            level = getattr(item, item._mptt_meta.level_attr)
            value = item.id
            label = mark_safe(conditional_escape(self.level_indicator) * level + smart_unicode(item.nom))
            if item.is_leaf_node():
                choices.append((value, label))
            else:
                choices.append((value, {'label': label, 'disabled': True}))

        self.fields['category'] = forms.ChoiceField(choices=choices, widget=SelectWithDisabled)


class MyModelAdmin(admin.ModelAdmin):
    form = MyModelAdminForm

samsic_site.register(MyModel, MyModelAdmin)
于 2013-02-03T18:59:44.967 に答える