3

MyModel有一个mptt的TreeForeignKey字段category。在 admin 中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 并为该forms.ChoiceField字段使用带有SelectWithDisabled小部件的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 回答