Substitution de la méthode dans Django ModelForm
J'ai de la difficulté du remplacement d'une ModelForm
méthode de sauvegarde. C'est l'erreur que je reçois:
Exception Type: TypeError
Exception Value: save() got an unexpected keyword argument 'commit'
Mes intentions sont d'avoir un formulaire de présenter de nombreuses valeurs pour les 3 zones, pour ensuite créer un objet pour chaque combinaison de ces champs, et pour enregistrer chacun de ces objets. Utile coup de pouce dans la bonne direction serait ace.
Fichier models.py
class CallResultType(models.Model):
id = models.AutoField(db_column='icontact_result_code_type_id', primary_key=True)
callResult = models.ForeignKey('CallResult', db_column='icontact_result_code_id')
campaign = models.ForeignKey('Campaign', db_column='icampaign_id')
callType = models.ForeignKey('CallType', db_column='icall_type_id')
agent = models.BooleanField(db_column='bagent', default=True)
teamLeader = models.BooleanField(db_column='bTeamLeader', default=True)
active = models.BooleanField(db_column='bactive', default=True)
Fichier forms.py
from django.forms import ModelForm, ModelMultipleChoiceField
from callresults.models import *
class CallResultTypeForm(ModelForm):
callResult = ModelMultipleChoiceField(queryset=CallResult.objects.all())
campaign = ModelMultipleChoiceField(queryset=Campaign.objects.all())
callType = ModelMultipleChoiceField(queryset=CallType.objects.all())
def save(self, force_insert=False, force_update=False):
for cr in self.callResult:
for c in self.campain:
for ct in self.callType:
m = CallResultType(self) # this line is probably wrong
m.callResult = cr
m.campaign = c
m.calltype = ct
m.save()
class Meta:
model = CallResultType
Fichier admin.py
class CallResultTypeAdmin(admin.ModelAdmin):
form = CallResultTypeForm
- Juste pour clarifier, vous souhaitez enregistrer un CallResultType pour chaque appel, pour chaque callResult, pour chaque campagne?
Vous devez vous connecter pour publier un commentaire.
Dans votre
save
vous devez avoir de l'argumentcommit
. Si quoi que ce soit remplace votre forme, ou s'il veut modifier ce que c'est l'épargne, il nesave(commit=False)
, modifier la sortie, puis l'enregistrer lui-même.Aussi, votre ModelForm devrait revenir au modèle de l'économie. Habituellement, un ModelForm de
save
ressemblera à quelque chose comme:Lire sur le
enregistrer
méthode.Enfin, beaucoup de ces ModelForm ne fonctionne pas tout simplement parce que de la façon dont vous accédez à des choses. Au lieu de
self.callResult
, vous devez utiliserself.fields['callResult']
.Mise à JOUR: En réponse à votre réponse:
De côté: Pourquoi ne pas simplement utiliser
ManyToManyField
s dans le Modèle, de sorte que vous n'avez pas à faire cela? Semble que vous êtes un stockage redondant des données et de faire plus de travail pour vous (et moi:P
).Cela permet à l'héritage de
CallResultTypeForm
, juste au cas où que jamais nécessaire.*args
et**kwargs
arguments à lasave
méthode.ModelClass.save()
méthode seulement a lacommit=True
argument maintenant -- il n'a pas leforce_insert
ouforce_update
arguments.