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 ManyToManyField
s 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 urllib2 HTTPError ve ok...
Java, nasıl bir temel sınıf'türet...
C#: dönüş türü Geçersiz kılma...
Django nasıl bir ModelForm içinde Fore...