2009-02-27 4 views
1
class Person(models.Model): 
    name = models.CharField(max_length=100) 

class Entry(models.Model): 
    text = models.CharField(max_length=100) 
    person = models.ManyToManyField(Person, blank=True, null=True) 

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = Entry 

À mon avis, j'ai besoin d'ajouter des identifiants pk à un formulaire soumis avant de l'enregistrer.Ajout de données au champ plusieurs-à-plusieurs d'un modèle dans une vue

data = request.POST.copy() 
# 'person' is a ManyToManyField to a 'Person' model 
# a form would normally send multiple id's as POST in this format -> u'id': [u'1', u'2'] 
# u'1,2' (an example) is a str variable accessible to the view 
data[u'person'] = u'1,2'.split(",") 
form = MyModelForm(data) 
if form.is_valid(): 
    form.save() 

Cela me donne:

int() argument must be a string or a number, not 'list'

qui est assez juste. Il fonctionne en cas de:

data[u'person'] = u'1' 

J'ai aussi essayé cela sans succès:

Comment puis-je enregistrer plusieurs id à cette ManyToManyField?
Doit être facile mais je manque le point.


EDIT: Le résultat souhaité est une nouvelle instance de MyModelForm (dans le tableau 'd'entrée') avec tous les identifiants stockés pour form.person (plusieurs enregistrements dans la table 'entry_person').


MISE À JOUR: Il me semble avoir isolé le problème.

Si je fais:

data = {} 
data[u'person'] = u'1,2'.split(",") 

Il ne travail que le résultat est:

{u'person': [u'1', u'2'],} 

Si je fais:

data = request.POST.copy() 
data[u'person'] = u'1,2'.split(",") 

Il ne fonctionne pas (donne l'erreur décrite ci-dessus) car le résultat est :

<QueryDict: {u'person': [[u'1', u'2']],}> 

Tout ce que je besoin est d'avoir

<QueryDict: {u'person': [u'1', u'2'],}> 

Toute suggestion comment?

+0

Pouvez-vous poster le code pour le modèle et la forme? –

+0

Merci! C'est bizarre mais je pense que j'ai trouvé ce qui cause le problème. – dmi

Répondre

0

La division que vous avez entré renvoie les éléments suivants:

[u'1', u'2'] 

Pour créer plusieurs instances dans votre base de données que vous auriez à itérer sur la liste:

for x in u'1,2'.split(","): 
    data[u'person'] = x 
    form = MyModelForm(data) 
    if form.is_valid(): 
    form.save() 

Par curiosité, pourquoi chaîne à liste de conversion en premier lieu? Ou est-ce juste un exemple général

+0

Merci! Cela crée n enregistrements de MyModelForm (chacun ayant 'person' = x de la boucle for), où n = nombre d'éléments dans le []. Ce dont j'ai besoin est de créer un enregistrement de MyModelForm et de stocker n id pour 'personne'. – dmi

0

Essayez:

new_form.person = [int(x) for x in u'1,2'.split(",")] 

Cela mis new_form.person à une liste de ints, et non une liste de chaînes.

+0

Merci! Cela ne fonctionne pas. TypeError: int() l'argument doit être une chaîne ou un nombre, pas 'list' – dmi

Questions connexes