如何修改管理页面上的选项-djang

2024-06-09 16:52:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为“state”的字段的模型:

class Foo(models.Model):
    ...
    state = models.IntegerField(choices = STATES)
    ...

对于每个状态,可能的选择都是所有状态的特定子集。例如:

if foo.state == STATES.OPEN:     #if foo is open, possible states are CLOSED, CANCELED
    ...
if foo.state == STATES.PENDING:  #if foo is pending, possible states are OPEN,CANCELED
    ...

因此,当foo.state更改为新状态时,它的一组可能的选择也会更改。

如何在管理添加/更改页面上实现此功能?


Tags: 模型iffooismodels状态openare
3条回答

为模型(例如MyModelAdmin)创建新的管理接口时,有特定的方法可以覆盖字段的默认选择。对于泛型choice field

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_choice_field(self, db_field, request, **kwargs):
        if db_field.name == "status":
            kwargs['choices'] = (
                ('accepted', 'Accepted'),
                ('denied', 'Denied'),
            )
            if request.user.is_superuser:
                kwargs['choices'] += (('ready', 'Ready for deployment'),)
        return super(MyModelAdmin, self).formfield_for_choice_field(db_field, request, **kwargs)

但也可以重写ForeignKeyMany to Many关系的选项。

您需要在该模型的ModelAdmin类中use a custom ModelForm。在自定义模型窗体的初始化方法中,可以动态设置该字段的选项:

class FooForm(forms.ModelForm):
    class Meta:
        model = Foo

    def __init__(self, *args, **kwargs):
        super(FooForm, self).__init__(*args, **kwargs)
        current_state = self.instance.state
        ...construct available_choices based on current state...
        self.fields['state'].choices = available_choices

你会这样使用它:

class FooAdmin(admin.ModelAdmin):
    form = FooForm

这似乎是一些javascript的工作。您希望选择框中的项列表根据其他项的值而更改,这些项可能是复选框或单选按钮。只有使用javascript才能动态实现这一点,而不需要用户保存表单并重新加载页面。

通过使用model admin的媒体类documentedhere,您可以在模型的管理页面中加载自定义javascript。

相关问题 更多 >