2009-11-19 7 views
0

J'essaye d'enregistrer un modelform qui représente un compte de banque mais je continue à obtenir un ValueError même si le formulaire semble valider. Les modèles que je dois utiliser sont:L'enregistrement de ModelForm échoue

class Person(models.Model): 
    name = models.CharField() 


class Bank(models.Model): 
    bsb = models.CharField() 
    bank_name = models.CharField() 
    def __unicode__(self): 
     return '%s - %s', (self.bank_name, self.bsb) 
    def _get_list_item(self): 
     return self.id, self 
    list_item = property(-get_list_item) 


class BankAccount(models.Model): 
    bank = models.ForignKey(Bank) 
    account_name = models.CharField() 
    account_number = models.CharField() 


class PersonBankAcc(models.Model): 
    person = models.ForeignKey(Person) 

Le ModelForm pour la personBankAcc;

def PersonBankAccForm(forms.ModelForm): 
    bank = forms.ChoiceField(widget=SelectWithPop) 
    class Meta: 
     model = PersonBankAcct 
     exclude = ['person'] 

    def __init__(self, *args, **kwargs): 
     super(PersonBankAccForm, self).__init__(*args, **kwargs) 
     bank_choices = [bank.list_item for banks in Bank.objects.all()] 
     bank_choices.isert(0,('','------')) 
     self.fields['bank'].choices = bank_choices 

La vue est:

def editPersonBankAcc(request, personBankAcc_id=0): 
    personBankAcc = get_object_or_404(PersonBankAcc, pk=personBankAcc_id) 
    if request.method == 'POST': 
     form = PersonBankAccForm(request.POST, instance=personBankAcc) 
     if form.is_valid(): 
      print 'form is valid' 
      form.save() 


     return HttpResponseRedirect('editPerson/' + personBankAcc.person.id +'/') 
    else: 
     form = PersonBankAccForm(instance=personBankAcc) 
    return render_to_response('editPersonBankAcc', {'form': form}) 

Lorsque je tente de sauver la forme que je reçois l'exception VlaueError même si elle est transmis le form.is_valid() vérifier l'erreur que je reçois est:
Cannot assign "u'26'": PersonBankAcc.bank must be a "bank" instance

Je sais que la question est à cause du dÉCOULANT un widget J'utilise dans le PersonBankAccForm:
bank = forms.ChoiceField(widget=SelectWithPop)
parce que si je l'enlève, cela fonctionne. Mais tout cela me donne la possibilité d'ajouter une nouvelle banque à la base de données via une popup, puis l'insère dans la liste de sélection, similaire aux formulaires contextuels d'administration. J'ai vérifié la base de données et la nouvelle banque est ajoutée. Mais ça échoue même si je ne change rien, si j'appelle le formulaire et le soumets, j'ai la même erreur.

Je ne comprends pas pourquoi il n'échoue pas lors de la vérification is_valid.

Toute aide serait grandement appréciée.

Merci
Andrew

+0

curieux est le modèle dans la méta ModelForm censé être EmpBankAcct ou devrait-il être PersonBankAcc? Je demande parce que je ne vois pas un modèle EmpBankAcct. –

+0

Une autre faute de frappe, je pensais une chose en tapant une autre. Ce devrait être PersonBankAcc. –

Répondre

3

mieux encore, je ne pense pas qu'il a vraiment besoin d'être dans la fonction init ...

def PersonBankAccForm(forms.ModelForm): 
    bank = forms.ModelChoiceField(queryset=Bank.objects.all(),widget=SelectWithPop(),empty_label='-----') 
    class Meta: 
     model = EmpBankAcct 
     exclude = ['person'] 

    def __init__(self, *args, **kwargs): 
     super(PersonBankAccForm, self).__init__(*args, **kwargs) 
+0

la raison en est que votre champ de choix essaye d'enregistrer une chaîne à un modèle qui veut une instance d'objet (de banque). –

+0

également, cela peut être une erreur de déplacer l'exemple dans ce formulaire, mais votre fonction init init indique iit au lieu de init. –

+0

Le iit est une faute de frappe en postant sur le forum. Lorsque je supprime le widget contextuel, je laisse la fonction init du formulaire telle quelle et fonctionne toujours. J'ai essayé ce que vous avez suggéré et je me retrouve avec une liste de sélection vide. –