【问题标题】:Django pre_save signals work when Model is saved but not ModelForm?Django pre_save 信号在保存模型而不是模型窗体时起作用?
【发布时间】:2017-04-07 17:25:41
【问题描述】:

我创建了一个 pre_save 信号来检查在保存模型之前字段是否已更新,如果是,则关闭 webhook。当我从 ./manage.py shell 编辑模型并保存它时,这工作正常,但如果我在使用表单的网站上编辑它,它不会触发 webhook。这是为什么呢?

apps.py

from django.apps import AppConfig


class ClientConfig(AppConfig):
    name = 'client'
    verbose_name = "Clients"
    label = 'client'

    def ready(self):
        import client.signals

信号.py

@receiver(pre_save, sender=ClientContact)
def send_hook_on_roadmap_update(sender, instance, **kwargs):
    """Watches for ClientContacts to be saved and checks to see if the
    pipeline attribute has changed.
    """
    try:
        obj = sender.objects.get(pk=instance.pk)
    except sender.DoesNotExist:
        pass  # Object is new, so field hasn't technically changed
    else:
        if not obj.pipeline == instance.pipeline:  # Field has changed
            instance.pipeline_updated()

models.py

class ClientContact(models.Model):
    title = models.CharField(_("Title"), max_length=50, blank=True, null=True)
    first_name = models.CharField(_("First name"), max_length=30, )
    last_name = models.CharField(_("Last name"), max_length=30, )
    email = models.EmailField(_("Email"), blank=True, max_length=75)
    create_date = models.DateField(_("Creation date"))
    address = models.ForeignKey('AddressBook', blank=True, null=True, on_delete=models.SET_NULL)
    pipeline = models.ForeignKey(Pipeline, blank=True, null=True, on_delete=models.SET_NULL)

forms.py

class ContactModelForm(forms.ModelForm):
    def __init__(self, client, organization, *args, **kwargs):
        super(ContactModelForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            'first_name',
            'last_name',
            'title',
            'email',
            'address',
            'pipeline',
        )
        self.helper.form_class = 'form-horizontal'
        self.helper.form_method = 'post'
        self.helper.html5_required = True
        self.helper.add_input(Submit('contact_save', 'Save'))
        self.fields['address'].queryset = AddressBook.objects.filter(organization=client)
        self.fields['pipeline'].queryset = Pipeline.objects.filter(organization=organization)

    class Meta:
        model = ClientContact
        fields = ('first_name', 'last_name', 'title', 'email', 'address', 'pipeline')

【问题讨论】:

    标签: python django python-2.7 django-models django-forms


    【解决方案1】:

    我不确定为什么它不起作用,但我建议您将该功能移至模型保存方法。

    class ClientContact(models.Model):
        title = models.CharField(_("Title"), max_length=50, blank=True, null=True)
        first_name = models.CharField(_("First name"), max_length=30, )
        last_name = models.CharField(_("Last name"), max_length=30, )
        email = models.EmailField(_("Email"), blank=True, max_length=75)
        create_date = models.DateField(_("Creation date"))
        address = models.ForeignKey('AddressBook', blank=True, null=True, on_delete=models.SET_NULL)
        pipeline = models.ForeignKey(Pipeline, blank=True, null=True, on_delete=models.SET_NULL)
    
        def save(self, *args, **kwargs):
            #check if obj is new or being updated
            try:
                obj = ClientContact.objects.get(pk=self.pk)
                if not obj.pipeline == self.pipeline:  # Field has changed
                    self.pipeline_updated()
            except ObjectDoesNotExist:
                pass
            #call super and store data
            super(ClientContact, self).save(*args, **kwargs)
    

    【讨论】:

    • 不知道最初的问题是什么,但这解决了我的问题。谢谢!
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 2014-05-09
    • 2014-07-19
    • 2011-09-03
    • 2020-08-02
    • 2019-08-17
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多