【问题标题】:Change value of field if input is not in choices Django ImportExportModelAdmin如果输入不在选择中,则更改字段的值 Django ImportExportModelAdmin
【发布时间】:2021-12-05 19:41:23
【问题描述】:

我以这个模型字段为例:

compliance_approve_status = models.CharField(max_length=200, blank=True, null=True, default=None, choices=review_status_choices)

有以下选择:

for_review = 'FOR REVIEW'
approved = 'APPROVED'
rejected = 'REJECTED'
review_status_choices = [(for_review, 'FOR REVIEW'), (approved, 'APPROVED'), (rejected, 'REJECTED')]

带有选项的简化版字段。

我希望能够设置一个默认值,如果用户从文件中导入并放入“FOR REVIEW”、“APPROVED”或“REJECTED”以外的内容,或者是NULL,它将默认到None。我认为添加 default=None 可以做到这一点,但它接受 Django 的 ImportExportModelAdmin 中的其他值。

【问题讨论】:

  • 创建一个widget 子类并在现场使用它。把你需要的逻辑放在clean方法中。

标签: django django-import-export


【解决方案1】:

这样的东西应该可以工作(未经测试):

class ComplianceStatusWidget(widgets.CharWidget):
    def clean(self, value, row=None, *args, **kwargs):
        if value:
            for status, text in models.YourModel.review_status_choices:
                if value.strip().lower() == text.lower():
                    return text
        return None

对此的一些改进:

  1. 考虑在 HTML 中使用 widget 以避免重复。

  2. 考虑使用构造函数将选项传递给小部件,以更好地分离逻辑。这将帮助您在其他上下文中重用小部件。

  3. 上面的代码不区分大小写,可能不是你想要的。

【讨论】:

  • 我现在明白这是怎么回事了。谢谢!!!
  • 有没有办法可以将参数传递给该类?类似class ComplianceChoicesWidget(CharWidget, choices):
  • 是的,有一个例子here - 如果仍然不清楚,请随时发布另一个问题。
  • 你好马修,我发布了另一个问题。我希望你也能回答它。这是link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
相关资源
最近更新 更多