【问题标题】:django custom field - how to modify another field's valuedjango 自定义字段 - 如何修改另一个字段的值
【发布时间】:2013-02-03 14:30:53
【问题描述】:

我正在开发一个 django 自定义字段。在自定义字段 def 中,我如何编写一些代码来保存另一个字段?例如,在自定义字段的 def 中,我编写了 pre_save 方法,但是在将值分配给其他模型字段之后,我调用了 model_instance.save() 方法,但这导致了无限循环。你能告诉我怎么做吗?

class FullNameField(models.CharField):

    def contribute_to_class(self, cls, name):  
        firstname_field = models.CharField(
                null=True, blank=True, max_length=50)
        lastname_field = models.CharField(
                null=True, blank=True, max_length=50)

        firstname_field.creation_counter = self.creation_counter  
        lastname_field.creation_counter = self.creation_counter  

        cls.add_to_class('firstname', firstname_field )  
        cls.add_to_class('lastname', lastname_field )  

        super(FullNameField, self).contribute_to_class(cls, name) 

上面的代码在syncdb期间成功创建了新字段firstname和lastname,我想要做的是,当我填充fullname字段时,firstname和lastname也应该被填充。这个全名逻辑只是一个例子,但要求是一样的。

【问题讨论】:

  • 请出示您的代码。从您的描述中不清楚您要做什么。
  • 每当我填充自定义字段时,此自定义字段背后的代码都会动态创建一些额外的字段。没事。同时,我想填充创建的额外字段,但不能这样做。我该怎么做?
  • 请展示您的代码和/或其中的片段,并解释您要做什么。您最后的评论只会给这个问题增加更多的混乱。
  • 添加代码@bikeshedder

标签: python django


【解决方案1】:

您可以使用pre_save 信号在课程保存时收到通知。

将此添加到您的 contribute_to_class 方法中:

from django.db.models.signals import pre_save

def populate_fullname(sender, instance, raw, **kwargs):
    if raw:
        return # be nice to syncdb
    fullname = u'%s %s' %  (instance.firstname, instance.lastname))
    setattr(instance, name, fullname)

pre_save.connect(populate_fullname, cls)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2016-05-31
    • 2019-11-03
    • 2017-01-28
    相关资源
    最近更新 更多