【问题标题】:Django admin - set a field when another one is enteredDjango admin - 在输入另一个字段时设置一个字段
【发布时间】:2012-05-09 20:09:34
【问题描述】:

很抱歉,如果我的问题已经在 SO 上提出,但我找不到我正在寻找的答案。

我用ImageFieldDateField 创建了一个Model。在我的 django 自动管理员(django 1.4)中,我有相应的ModelAdmin:我想在用户填充ImageField 时从图像中设置日期。总而言之,我想在选择 ImageField 时得到帮助,例如通过覆盖一种选择后方法。

我该怎么做?我可以在 django 文档中读到 clean 方法存在,但我不清楚它的调用方式/时间。

感谢您的帮助!

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    您可以覆盖模型的save() 方法或更好地使用pre_save signal。在里面你可以检查对象是否有图像但没有日期,并将日期设置为datetime.datetime.now()

    【讨论】:

    • 感谢您的回答。我想在输入ImageField 时调用更多,在保存之前这么多,是否有可以使用的信号?
    • 你的意思是 - 在上传到服务器之前?您可以使用 JS 填充当前时间戳的隐藏字段。
    • 我意识到我的请求很愚蠢(或者至少很复杂,因为图像确实还没有上传)。所以我决定重写save 方法。
    【解决方案2】:

    看看来自 django-filer 的 Image 模型:
    https://github.com/stefanfoulis/django-filer/blob/develop/filer/models/imagemodels.py

    你可以在 save 方法中做类似的事情。

    def save(self, *args, **kwargs):
        if self.date_taken is None:
            try:
                exif_date = self.exif.get('DateTimeOriginal', None)
                if exif_date is not None:
                    d, t = str.split(exif_date.values)
                    year, month, day = d.split(':')
                    hour, minute, second = t.split(':')
                    self.date_taken = datetime(
                                       int(year), int(month), int(day),
                                       int(hour), int(minute), int(second))
            except:
                pass
        if self.date_taken is None:
            self.date_taken = datetime.now()
        self.has_all_mandatory_data = self._check_validity()
        try:
            # do this more efficient somehow?
            self.file.seek(0)
            self._width, self._height = PILImage.open(self.file).size
        except Exception:
            # probably the image is missing. nevermind.
            pass
        super(Image, self).save(*args, **kwargs)
    

    【讨论】:

    • 感谢您的回答,如上所述,在 ilvar 回答之后,我希望在输入 ImageField 时调用更多内容。
    猜你喜欢
    • 2019-03-22
    • 2022-07-20
    • 1970-01-01
    • 2021-06-22
    • 2020-08-04
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多