2009-06-22 10 views
0

Fondamentalement, j'ai un modèle avec un champ ManyToMany, puis un modelform dérivé de ce modèle où ce champ est rendu comme une sélection "multiple choix". Dans mon modèle je fais omettre ce champ, en choisissant à la place de préparer les valeurs pour ce champ dans la vue, puis passez ces valeurs préparées dans request.POST (en fait une copie de request.POST parce que request.POST est immuable), alors feed request.POST à ​​la forme, puis continuer comme d'habitude. Je ne peux pas comprendre comment faire cela, car request.POST n'est pas seulement un simple dictionnaire python, mais plutôt un QueryDict, qui se comporte un peu différemment. Le champ que j'ai besoin de remplir s'appelle "not_bases". Quand je crée le widget en utilisant le formulaire, cela fonctionne parfaitement bien en interne, mais pas à mon goût. Lorsque j'inspecte la valeur POST soumis django-formulaire via la fenêtre d'erreur de débogage pratique de django, le QueryDict travail ressemble à ceci:Comment créer une entrée "type de liste" personnalisée à request.POST

<QueryDict: {u'not_bases': [u'005', u'00AR', u'00F', u'00FD'], [...] }> 

Il semble que la valeur "not_bases" est une liste, mais ce n'est pas simplement une liste. Je ne peux pas juste .append() parce que ça ne marchera pas. J'ai creusé autour de la documentation et trouvé .update(), qui apparaît pour fonctionner, mais ne fonctionne pas. Voici mon code:

newPOST = request.POST.copy() 
for base in bases: 
    newPOST.update({"not_bases": base.identifier}) 

et voici la sortie:

<QueryDict: {u'not_bases': [u'KMER', u'KYIP'], u'reference': [u''], [...] }> 

Mais quand je nourris que QueryDict à la forme, je reçois une erreur de validation de formulaire qui dit « not_bases: Entrez une liste de valeurs.". Il est évident que les choses list-looking provenant de la représentation str() du QueryDict ne sont pas les mêmes dans les deux cas ci-dessus, même si elles ressemblent exactement

Alors comment faire?

+0

Si ma compréhension du code source est correcte, vous devriez pouvoir .append() à la liste not_bases. Pouvez-vous clarifier ce que vous voulez dire par "ça ne marchera pas"? –

+0

Hacking request.POST est la mauvaise façon d'atteindre votre objectif. Au lieu de cela, modifiez votre formulaire afin qu'il ne nécessite pas ce champ, mais définit la valeur manuellement dans le modèle enregistré (ou tout ce que votre formulaire fait avec les données POSTed). –

Répondre

2

On ne sait pas vraiment ce que vous essayez de faire ici, mais je doute que le piratage de QueryDict soit la bonne façon d'y parvenir.

Si vous essayez de personnaliser l'affichage du champ not_bases, vous pouvez simplement remplacer la définition dans votre déclaration de ModelForm:

class MyModelForm(forms.ModelForm): 
    not_bases = forms.ChoiceField(choices=[(base, base) for base in bases]) 

    class Meta: 
     model = MyModel 

Ou, si vous voulez simplement éviter de montrer sur le formulaire, vous peut l'exclure du formulaire et définir la valeur après validation.

class MyModelForm(forms.ModelForm): 

    class Meta: 
     model = MyModel 
     exclude = ['not_bases'] 


.... 
if request.POST: 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.not_bases = bases 
     instance.save() 

Est-ce que l'un ou l'autre fait ce que vous voulez?

+0

J'ai mon code actuel, j'ai "not_bases" ainsi que 5 autres champs "XXX_bases". Le problème est qu'un objet Base ne peut exister que dans un et un seul de ces champs. Pour ce faire, j'ai la forme pas drawl ces "XX_fields" et à la place faire le mien en utilisant des boutons radio. J'ai écrit un peu de code qui traverse mes champs personnalisés dans les données POST, et crée une liste pour chaque champ. Je pourrais les ajouter après commit = False, mais pendant que je fais des boucles et que je fais des listes, pourquoi ne pas les ajouter à request.POST? Juste sauve un pas ... – priestc

Questions connexes