Django ModelForm kayıt yöntemini geçersiz kılma
Sorun ModelForm bir kayıt yöntemi geçersiz kılma yaşıyorum. Bu aldığım hata:
Exception Type: TypeError
Exception Value: save() got an unexpected keyword argument 'commit'
Benim niyetim bir form 3 alanlar için birçok değerler gönder, sonra da bu alanların her birleşimi için bir nesne oluşturmak için, ve bu nesnelerin her kurtarmak zorunda. Doğru yönde yardımcı dürtmek ace olurdu.
models.py dosya
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)
forms.py dosya
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
admin.py dosya
class CallResultTypeAdmin(admin.ModelAdmin):
form = CallResultTypeForm
CEVAP
Senin 14 ** bağımsız commit olmalı. Bir şey formunuz geçersiz kılma veya kaydetme ne değiştirmek istiyor, save(commit=False) çıkış değiştir yap ve kendini kurtar.
Ayrıca, ModelForm saklıyor modeli dönmelidir. Genellikle save bir ModelForm bir şey gibi görünecektir:
def save(self, force_insert=False, force_update=False, commit=True):
m = super(CallResultTypeForm, self).save(commit=False)
# do custom stuff
if commit:
m.save()
return m
the save method kadar okuyun.
Son olarak, bu ModelForm bir sürü şey sadece giriş yapıyorsun, çünkü işe yaramaz. ** 20 yerine self.fields['callResult'] kullanmak gerekir.
GÜNCELLEME: Cevap, yanıt:
Kenara:Neden bunu yapmak zorunda değilsin bu yüzden Modeli ManyToManyFields değil mi? Gereksiz verileri saklamak gibi görünüyor ve kendini (ve beni :P) için daha fazla iş yapma.
from django.db.models import AutoField
def copy_model_instance(obj):
"""
Create a copy of a model instance.
M2M relationships are currently not handled, i.e. they are not copied. (Fortunately, you don't have any in this case)
See also Django #4027. From http://blog.elsdoerfer.name/2008/09/09/making-a-copy-of-a-model-instance/
"""
initial = dict([(f.name, getattr(obj, f.name)) for f in obj._meta.fields if not isinstance(f, AutoField) and not f in obj._meta.parents.values()])
return obj.__class__(**initial)
class CallResultTypeForm(ModelForm):
callResult = ModelMultipleChoiceField(queryset=CallResult.objects.all())
campaign = ModelMultipleChoiceField(queryset=Campaign.objects.all())
callType = ModelMultipleChoiceField(queryset=CallType.objects.all())
def save(self, commit=True, force_insert=False, force_update=False, *args, **kwargs):
m = super(CallResultTypeForm, self).save(commit=False, *args, **kwargs)
results = []
for cr in self.callResult:
for c in self.campain:
for ct in self.callType:
m_new = copy_model_instance(m)
m_new.callResult = cr
m_new.campaign = c
m_new.calltype = ct
if commit:
m_new.save()
results.append(m_new)
return results
Bu hiç gerekli değil CallResultTypeForm Her ihtimale karşı, devralma için izin verir.

Django: uygulama şablonu Geçersiz kılm...
Geçersiz kılma !önemli stil...
CSS (y): mutlak konumlandırılmış bir ö...
Yerel kütüphane ekleme "java.kütü...
jQuery geçersiz kılma varsayılan doğru...