SORU
3 Mayıs 2009, Pazar


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
3 Mayıs 2009, Pazar


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • PlayStation

    PlayStation

    16 Aralık 2005
  • TheRightTire

    TheRightTire

    14 EKİM 2009