自定义 Django 模型字段中的“对象没有属性”

2024-03-05

我正在尝试创建一个 Django 模型字段,该字段表示 HTML 中包含天、小时、分钟和秒文本输入字段的持续时间,并使用 ical 格式(RFC5545)将持续时间存储在数据库中。

(这与我的问题有关如何在 Django 中创建一个 ical 持续时间字段? https://stackoverflow.com/questions/13597063/how-to-create-an-ical-duration-field-in-django)

这是我的方法:

谢谢巴卡尔和波尔。以下是我的想法。

from django.db import models
from icalendar.prop import vDuration
from django.forms.widgets import MultiWidget
from django.forms import TextInput, IntegerField
from django.forms.util import flatatt
from django.forms.fields import MultiValueField
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe
from django.utils.text import capfirst
from django.utils.translation import ugettext_lazy as _
from django.core import validators
from datetime import timedelta

def is_int(s):
    try: 
        int(s)
        return True
    except ValueError:
        return False

class Widget_LabelInputField(TextInput):
    """
    Input widget with label
    """
    input_type="numbers"
    def __init__(self, labelCaption, attrs=None):
        self.labelCaption = labelCaption
    super(Widget_LabelInputField, self).__init__(attrs)

    def _format_value(self, value):
        if is_int(value):
            return value
        return '0'

    def render(self, name, value, attrs=None):
        if value is None:
            value = '0'
        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
        if value != '':
            # Only add the 'value' attribute if a value is non-empty.
            final_attrs['value'] = force_unicode(self._format_value(value))
        if (self.labelCaption):
        typeString = self.labelCaption + ': '
        else:
            typeString = ''           
        return mark_safe(u'' + typeString + '<input%s style=\'width: 30px; margin-right: 20px\'/>' % flatatt(final_attrs))



class Widget_DurationField(MultiWidget):
    """
    A Widget that splits duration input into two <input type="text"> boxes.
    """

    def __init__(self, attrs=None):
        widgets = (Widget_LabelInputField(labelCaption='days', attrs=attrs),
                   Widget_LabelInputField(labelCaption='hours', attrs=attrs),
                   Widget_LabelInputField(labelCaption='minutes', attrs=attrs),
                   Widget_LabelInputField(labelCaption='seconds', attrs=attrs)
                   )
        super(Widget_DurationField, self).__init__(widgets, attrs)

    def decompress(self, value):
        if value:
            duration = vDuration.from_ical(value)
            return [str(duration.days), str(duration.seconds // 3600), str(duration.seconds % 3600 // 60), str(duration.seconds % 60)]
        return [None, None, None, None]



class Forms_DurationField(MultiValueField):
    widget = Widget_DurationField
    default_error_messages = {
        'invalid_day': _(u'Enter a valid day.'),
        'invalid_hour': _(u'Enter a valid hour.'),
        'invalid_minute': _(u'Enter a valid minute.'),
        'invalid_second': _(u'Enter a valid second.')
    }

    def __init__(self, *args, **kwargs):
        errors = self.default_error_messages.copy()
        if 'error_messages' in kwargs:
            errors.update(kwargs['error_messages'])
        fields = (
            IntegerField(min_value=-9999, max_value=9999,
                      error_messages={'invalid': errors['invalid_day']},),
            IntegerField(min_value=-9999, max_value=9999,
                      error_messages={'invalid': errors['invalid_hour']},),
            IntegerField(min_value=-9999, max_value=9999,
                      error_messages={'invalid': errors['invalid_minute']},),
            IntegerField(min_value=-9999, max_value=9999,
                      error_messages={'invalid': errors['invalid_second']},),
        )
        super(Forms_DurationField, self).__init__(fields, *args, **kwargs)

    def compress(self, data_list):
        if data_list:
            if data_list[0] in validators.EMPTY_VALUES:
                raise ValidationError(self.error_messages['invalid_day'])
            if data_list[1] in validators.EMPTY_VALUES:
                raise ValidationError(self.error_messages['invalid_hour'])
            if data_list[2] in validators.EMPTY_VALUES:
                raise ValidationError(self.error_messages['invalid_minute'])
            if data_list[3] in validators.EMPTY_VALUES:
                raise ValidationError(self.error_messages['invalid_second'])

            return vDuration(timedelta(days=data_list[0],hours=data_list[1],minutes=data_list[2],seconds=data_list[3]))
        return None




class Model_DurationField(models.Field):
    description = "Duration"

    def __init__(self, *args, **kwargs):
        super(Model_DurationField, self).__init__(*args, **kwargs)

    def db_type(self, connection):
        return 'varchar(255)'

    def get_internal_type(self):
        return "Model_DurationField"

    def to_python(self, value):
        if isinstance(value, vDuration) or value is None:
            return value

        return vDuration.from_ical(value) 

    def get_prep_value(self, value):
        return value.to_ical() 

    def formfield(self, **kwargs):
        defaults = {
            'form_class': Forms_DurationField,
            'required': not self.blank,
            'label': capfirst(self.verbose_name),
            'help_text': self.help_text}
        defaults.update(kwargs)
        return super(Model_DurationField, self).formfield(**defaults)

它适用于以下模型:

class TestModel(models.Model):
    ID = models.CharField(max_length=255)
    start = models.DateTimeField(null=True)
    #duration = models.CharField(max_length=255,null=True) commented out
    otherDuration = duration.Model_DurationField(null=True)

但不是在这个:

class TestModel(models.Model):
    ID = models.CharField(max_length=255)
    start = models.DateTimeField(null=True)
    duration = models.CharField(max_length=255,null=True)  # not commented out
    otherDuration = duration.Model_DurationField(null=True)

我收到以下错误:

File "/somepath/models.py", line 5, in TestModel
    otherDuration = duration.Model_DurationField(null=True)
AttributeError: 'CharField' object has no attribute 'Model_DurationField'

这让我感到困惑......似乎 python 认为我的字段是前一个字段的属性,但前提是它是 CharField。有任何想法吗?


我犯傻了。问题是我将定义模型的文件命名为duration.py,因此与“duration”字段存在命名冲突。我重命名了该文件并且它起作用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 Django 模型字段中的“对象没有属性” 的相关文章

随机推荐

  • 图灵完整性需要什么逻辑门?

    我儿子最近在玩小小大星球2 我注意到游戏编辑器允许与门 或门和非门 它是图灵完备吗 如果是这样 任何人都可以推荐一个学习资源 将这些原语转换成更高级别的条件 if 之类的东西吗 你不需要并且one ofAND 或 OR 能够完成所有二进制逻
  • 在 emacs 中调试 python 程序

    如何在 emacs 中调试 python 程序 我在用着python mode el 我发现参考文献建议 import pdb pdb set trace 但我不知道如何使用它 Type M x cd将目录更改为您要调试的程序的位置 类型M
  • headerenricher Spring 集成和 java dsl

    我使用 Spring Integration 和 java dsl 规范来实现我的 IntegrationFlow 我想使用自定义标头丰富器将一些文件名添加到标头 它将类似于 public class FileHeaderNamingEnr
  • 如何根据设置的主题更改flutter中的状态栏图标和文本颜色?

    如何在没有任何第三方插件的情况下更新状态栏图标的颜色 在我的主题类中 我有一个函数 我正在其中尝试下面的代码 但尚未取得结果 截至目前的主题代码 custom light theme for app static final customL
  • 有没有更有效的方法将我的图像划分为重叠的块?

    我想将图像划分为重叠的块 并单独处理这些块 并将每个矩阵的输出存储到一个矩阵中 我尝试过使用im2col但这根本不实用 我的代码是 kek im2col images m 1 64 64 sliding for i 1 size kek 2
  • 如何增加 Firebase 实时数据库 (v9) 中的值

    我注意到有关于如何在 Javascript v8 中增加实时数据库值的说明 添加了 ServerValue increment 以支持无需事务的原子字段值增量 API 文档在这里 使用示例 firebase database ref nod
  • C#:以与分配相反的顺序处理资源是否有优势?

    许多年前 我被告诫要尽可能以与分配方式相反的顺序释放资源 那是 block1 malloc block2 malloc do stuff free block2 free block1 我想象在 640K MS DOS 机器上 这可以最大限
  • ASP.Net MVC 6 + WebAPI Auth - 将 MVC 重定向到登录,但如果使用 WebAPI,则返回 401

    我有一个 AngularJS MVC WebAPI 我正在尝试 使用标准 个人账户 进行MVC认证 使用相同的用户和密码进行基于 WebAPI 的身份验证 问题是 从 AngularJS 来看 一切正常 cookie 交换发生 Web AP
  • 使用 ExtJS 4 的动态模型

    在 ExtJS 3 x 中 我能够使用 Store 的 fields 属性 但在 ExtJS 4 中我似乎必须绝对使用模型 这很好 但就我而言 它不是静态模型 我需要动态定义字段 有时还需要更改它们 我可以重新创建一个模型 但我需要使用不同
  • Ruby 2.1 和 Nokogiri 安装错误?

    我知道这个问题已经在这里 解决 了很多次 但我已经尝试了所有的解决方案 但仍然无法使其发挥作用 这是我的错误 22 01 14 17 57 56 gt gem install nokogiri Building native extensi
  • 如何计算具有共同列名的不同数据框之间的差异

    我有三个数据帧 并尝试计算由数据帧 1 调节的两个数据帧 Df2 和 Df3 之间的差异 如以下示例中所述 我有三个数据帧 Df1 Df2 和 Df3 它们具有通用名称 第一步 在 Df1 中 我想将 标准 列的值与所有三列 Das Dss
  • 有没有办法从跟踪生命周期的任何地方获取给定起点的请求的完整跟踪?

    有没有办法从跟踪生命周期的任何地方获取完整的跟踪请求 基本上 如果我有跟踪的中间点或终点 我可以使用这些点来获取请求的完整跟踪吗 我想构建一个跟踪服务 在 Golang 中 只要用户在请求跟踪期间随时提供点 跨度 该服务就可以返回请求的完整
  • 机器人类类似于 android 类[重复]

    这个问题在这里已经有答案了 可能的重复 Android API 如 java awt Robot https stackoverflow com questions 4416228 android api like java awt rob
  • SQL对具有重叠时间跨度的数据进行分组

    我需要根据记录开始和结束时间通过重叠时间跨度将彼此相关的数据分组在一起 SQL fiddle在这里 http sqlfiddle com 18 87e4b 1 0 http sqlfiddle com 18 87e4b 1 0 我构建的当前
  • 更改 WPF 应用程序中的默认打印机

    我正在寻找更改 WPF 应用程序中默认打印机的最佳方法 以下是我们希望应用程序能够执行的步骤 从下拉列表中选择映射到打印机名称的位置 将默认打印机更改为映射名称 启动 IE 并指向 SSRS 报告 然后 用户将从 IE 打印报告 IE 将使
  • 绘图:平行坐标图:轴样式

    我真的很喜欢平行坐标图 情节很好 但我刚刚遇到了一个需要帮助的问题 某些坐标是否可以使用基于 log10 的轴 正如您在下面的示例中看到的 执行 log10 变换可以更好地区分较小的值 然而 通过转换数据 我们失去了解释这些值的能力 我更喜
  • 检查每个 Node.js 请求的身份验证凭据

    我使用 Node js 与 Express 和 connect auth 来对用户进行身份验证 这是请求 index时的验证 if req isAuthenticated res redirect dashboard else res re
  • 将 [0-255] 整数范围转换为 [0.0-1.0] 浮点范围

    在 WxWidget 中 颜色由 RGB 整数三元组表示 要使用 0 0 1 0 浮点三元组表示与其他库交互 需要进行转换 WxPython Numpy 或 Python 中是否已经存在这样的转换函数 您可以将每个元素除以 255 或 25
  • 解析数据 org.json.JSONException 时出错:输入结束于字符 0

    解析 JSON 时出现错误 解析数据 org json JSONException 时出错 在字符 0 处输入结束 错误日志 04 19 20 51 00 635 E ViewRootImpl 24857 sendUserActionEve
  • 自定义 Django 模型字段中的“对象没有属性”

    我正在尝试创建一个 Django 模型字段 该字段表示 HTML 中包含天 小时 分钟和秒文本输入字段的持续时间 并使用 ical 格式 RFC5545 将持续时间存储在数据库中 这与我的问题有关如何在 Django 中创建一个 ical