如何修改 Django Admin 上的选择

新手上路,请多包涵

我有一个模型,它有一个名为“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 更改为新状态时,其可能的选择集也会更改。

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

原文由 shanyu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 584
2 个回答

您需要在该模型的 ModelAdmin 类中 使用自定义 ModelForm 。在自定义 ModelForm 的 init 方法中,您可以动态设置该字段的选项:

 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

原文由 Carl Meyer 发布,翻译遵循 CC BY-SA 2.5 许可协议

当您为模型(例如 MyModelAdmin)创建一个新的管理界面时,有一些特定的方法可以覆盖字段的默认选择。对于通用 选择字段

 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)

但您也可以覆盖 ForeignKey多对多 关系的选择。

原文由 slamora 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题