【问题标题】:How to trigger custom python code when a valid django form is saved in the database如何在数据库中保存有效的 django 表单时触发自定义 python 代码
【发布时间】:2019-03-22 16:57:01
【问题描述】:

这里是Django新手,我按照this教程创建了一个简单的表单,我的表单正确地将数据保存在我的Postgres连接的本地数据库中。我想知道,每当将有效表单保存到数据库中时,如何触发函数?我要运行的代码是一个写在 python 文件中的简单函数,它对第一种形式给出的最新数据进行一些处理。我希望它仅在保存有效的表单数据时运行,并且想知道 django 信号触发器是否是我要走的路。随时要求进一步澄清。换句话说,我想对数据进行一些后处理,这些数据存在于数据库中,正在由表单填写,并且只有在数据库中输入有效数据时才触发后处理强>。

这是我的代码:

views.py

from django.shortcuts import render
from django.http import HttpResponse
from .forms import auditform, ClientAuditForm
from django.db.models.signals import post_save
from . import rocode



# def auditingfun(request):
#     return HttpResponse('Auditing form works')
# # Create your views here.

def auditingfun(request):

    if request.method == 'POST':
        forminput = auditform(request.POST)
        if forminput.is_valid():

            Name = forminput.cleaned_data['Name']
            Origin = forminput.cleaned_data['Origin']
            ClientAddress = forminput.cleaned_data['ClientAddress']
            DispatchType = forminput.cleaned_data['DispatchType']
            ETA = forminput.cleaned_data['ETA']
            GSTIN = forminput.cleaned_data['GSTIN']
            # print(GSTIN,Name,Origin,Destination,MaterialType,Preference,ClientAddress,DispatchType,ETA)

    forminput = auditform(request.POST)
    return render(request, 'auditing/auditform.html', {'forminput': forminput} )

forms.py

from django import forms
from .models import auditModel

class auditform(forms.Form):
    Origin = forms.CharField()
    Destination = forms.CharField()
    MaterialType = forms.CharField()
    Preference = forms.CharField()
    ClientAddress = forms.CharField(widget=forms.Textarea)
    Name = forms.CharField()
    GSTIN = forms.IntegerField()
    DispatchType = forms.ChoiceField(choices=[('Question','Inbound'),('Other','Outbound')])
    ETA = forms.CharField()


class ClientAuditForm(forms.ModelForm):

    class Meta:
            model = auditModel
            fields = ('Origin','Destination','MaterialType','GSTIN','Name','Preference','ClientAddress','DispatchType','ETA')

为了简单起见,想象一下自定义代码(在 views.py 文件中作为 rocode.py 导入)我刚刚添加了输入的数据并将数据存储在同一个数据库中的不同列中。

【问题讨论】:

  • 可以回答这个问题,但如果你是新手.. 查找 django 信号
  • @bryan60 我是新手,但我将能够查找或研究我需要做的任何事情来完成这项工作。所以把你得到的给我:)
  • 我的意思是我会或多或少地从 django 文档中复制和粘贴,但确定为什么不这样做
  • 您的代码当前是否成功地将表单实际保存到数据库中?在您粘贴的代码中似乎根本没有这样做?
  • 您是否尝试使用ClientAuditForm 使其工作,然后切换到auditform 以使其工作?发布您的“工作”代码,然后单独发布任何尝试会更有帮助。

标签: python django forms


【解决方案1】:

你想在这里使用的是信号。信号是在数据库中添加或更新项目后执行的某些功能。假设您要连接的模型名为“MyModel”,请执行以下操作:

from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import MyModel


@receiver(post_save, sender=MyModel)
def my_handler(sender, instance, created, **kwargs):
    if created:
        # run your custom code HERE

instance 是插入/更新的内容,created 是布尔值,表示这是更新还是插入。

文档:https://docs.djangoproject.com/en/2.1/topics/signals/

【讨论】:

  • 为什么要使用信号?信号用于允许扩展/处理无法轻易覆盖的行为(例如 3rd 方包/django 内部),或适用于许多不同的地方。另外,如果需要的是后期处理,不应该是post_save吗?
  • 信号用于后期处理(是的,应该是后期保存,复制粘贴错误)
  • 澄清一下,我认为覆盖表单或模型的save 可能更容易/更干净。
  • 目的是职责分离和清晰可维护的代码。表单保存方法用于将项目放入数据库。后处理(例如预缓存、更新搜索索引、发送通知、调用 webhook、实际保存之外的东西)是信号用例。
  • 我明白你的意思,我同意这些原则!然而,有人可能会争辩说,信号在很多时候是一个非常“间接”的地方。 1) 我的怀疑是他真正想要的是pre-处理,因此在他保存之前更改数据。 2) 但即使他想要 post 处理,那么在保存表单后触发常规函数也许是可以的(干净的意图,仍然是分开的,可以说是缓存/搜索/通知模块...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2010-11-26
  • 2021-04-26
  • 1970-01-01
  • 2018-01-22
  • 2015-11-20
  • 1970-01-01
相关资源
最近更新 更多