我如何基于一种形式在具有可重用功能的 2 个模型(表)中创建行

how can i create rows in 2 models(tables) with reusable functions based on one form

我想通过单个 POST 请求将数据保存在两个模型中。两种不同的模型(OF,Encours)

Here's my models.py:

class OF(models.Model):
Id_OF= models.BigAutoField(primary_key=True)
Numero_Of = models.BigIntegerField(unique=True,blank=False)
class Dimension_OF(models.TextChoices):
    PD_inférieur_à_500mm="PD"
    MD_Entre_500_et_1500mm="MD"
    GD_supérieur_à_1500mm="GD"
Dimension_OF = models.CharField(max_length=20, blank=False,choices=Dimension_OF.choices)
class Machine(models.TextChoices):
    MGP1="MGP1"
    MGP2="MGP2 "
    MGP3="MGP3"
    MGP4="MGP4"
    MGP5="MGP5"
    MGP6="MGP6"
    MGP7="MGP7"
    MGP8="MGP8"
Machine=models.CharField(max_length=10,choices=Machine.choices, blank=False)
class Scenario(models.TextChoices):
    Ajustage_Controle="scenario1"
    Ajustage_Redressage_Controle="scenario2"
    Ajustage_Formage_Controle="scenario3"
    Ajustage_Redressage_Formage_Controle="scenario4"

Scenario = models.CharField(max_length=50,choices=Scenario.choices, blank=False)
Date_E_initial=models.DateTimeField(auto_now_add=True,auto_now=False)
Date_S_Final=models.DateTimeField(null=True, blank=True)
Etat_OF=models.CharField(max_length=50, null=True, blank=True)
Nb_jrs_att_Usin=models.DurationField(null=True, blank=True)
Nb_jrs_att_TM=models.DurationField(null=True, blank=True)
Nb_jrs_att_total=models.DurationField(null=True, blank=True)

def _str_(self):
    return self.Scenario

class Encours(models.Model):
Id_encours=models.IntegerField(primary_key=True)
OF = models.ForeignKey(OF, on_delete=models.CASCADE )
class Nom_encours(models.TextChoices):
    EN_MGP1="Encours MGP1"
    EN_MGP2="Encours MGP2"
    EN_MGP3="Encours MGP3"
    EN_MGP4="Encours MGP4"
    EN_MGP5="Encours MGP5"
    EN_MGP6="Encours MGP6"
    EN_MGP7="Encours MGP7"
    EN_MGP8="Encours MGP8"
    EN_AJU_GD="Encours Ajustage GD"
    EN_AJU_MD="Encours Ajustage MD"
    EN_AJU_PD="Encours Ajustage PD"
    EN_RED="Encours Redressage"
    EN_For="Encours Formage"
    EN_Contr_GD="Encours Contrôle GD"
    EN_Contr_MD="Encours Contrôle MD"
    EN_Contr_PD="Encours Contrôle PD"
Nom_encours = models.CharField(max_length=30,choices=Nom_encours.choices)
Capacite = models.IntegerField(default=0)
Date_E_Encours=models.DateTimeField(null=True, blank=True)
Date_S_Encours=models.DateTimeField(null=True, blank=True)
def _str_(self):
    return self.Nom_encours

但是在将数据保存到Encours之前我想定义一些函数来测试字段 举个例子 ; if OF.Machine=='MGP1' 然后在 Encours 模型中创建一行 Nom_Encours='Encours MGP1'Date_E_Encours = Date_E_initial 自动添加。

views.py

def lancerOF(request):

form = OFLancementForm(request.POST or None)
if request.method == 'POST':
    if form.is_valid():
        form.save()
        messages.success(request, 'OF lancé avec succès', extra_tags='alert') 
        return redirect('lancer')
    else:
        messages.warning(request, 'Verifiez les données saisies')

return render(request, "lancerOF.html",{'form':form})

and i use a simple form

class OFLancementForm(forms.ModelForm):
class Meta:
    model = OF
    fields = {
       'Numero_Of', 
       'Dimension_OF',
       'Machine',
       'Scenario'
    }
    widgets = { "Dimension_OF": forms.RadioSelect ,"Machine": forms.RadioSelect ,"Scenario": forms.RadioSelect}

如果可能的话,我可以在哪里进行测试以检查 OF 属性并将数据保存到我的模型中。

PS:这是我第一个真正的django项目。 谁能帮帮我?

def lancerOF(request):

    form = OFLancementForm(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            myobject = form.save()
            # here you can do your logic
            if myobject.Machine == "MPG1":
                ...
            messages.success(request, 'OF lancé avec succès', extra_tags='alert') 
            return redirect('lancer')
        else:
            messages.warning(request, 'Verifiez les données saisies')

    return render(request, "lancerOF.html",{'form':form})

或者另一种方法是使用 Django 的 post_save 信号。

或者您可以覆盖 OF 的 save() 方法:

class OF(models.Model):
    def save(self, *args, **kwargs):
        super(OF, self).save(*args, **kwargs)
        if self.Machine == "MPG1":
            # your logic here.