2010-07-04 6 views
1

Je suis nouveau sur python et sur django, donc cette question sera probablement facile à résoudre, mais je ne peux pas la faire fonctionner. Fondamentalement, j'ai un modèle qui contient deux clés étrangères de type utilisateur. Je construis un formulaire dans lequel je veux supprimer l'un des choix d'un ModelChoiceField basé sur un autre champ. Je veux que l'utilisateur soit incapable de se sélectionner dans le formulaire. Mon code.Délimiter les choix dans ModelChoiceField

Models.py

from django.db import models 
from django.contrib.auth.models import User 

class Deuda(models.Model): 
    ESTADOS = (("S", "Sin pagar"), ("P", "Pagada"), ("PC", "Pagada (Confirmada)")) 

    propietario = models.ForeignKey(User, verbose_name="Propietario", related_name="propietario_deuda") 
    adeudado = models.ForeignKey(User, verbose_name="Adeudado", related_name="adeudado_deuda") 
    cantidad = models.FloatField("Cantidad") 
    descripcion = models.TextField("Descripcion") 
    estado = models.CharField(max_length=2, choices=ESTADOS) 

    def __str__(self): 
     return self.descripcion 

forms.py

from django import forms 
from housemanager.iou.models import Deuda 
from django.contrib.auth.models import User 

class DeudaForm(forms.ModelForm): 

    class Meta: 
     model = Deuda 
     exclude = ('propietario',) 

    def __init__(self, propietario): 
     d = Deuda() 
     d.propietario = propietario 
     forms.ModelForm.__init__(self, instance=d) 

    adeudado = forms.ModelChoiceField(queryset=User.objects.exclude(pk=d.propietario.pk)) 

extrait de views.py

[...] 
form = DeudaForm(request.user) 

Alors mon idée est de passer l'utilisateur à la forme afin qu'il puisse définir un ModelChoiceField qui ne l'inclut pas. Mon code ne fonctionne pas car d n'est pas dans la portée lors de la définition de 'adedado'. Je suis sûr qu'il doit y avoir plusieurs façons d'atteindre cet objectif, n'hésitez pas à changer quoi que ce soit sur ma conception.

Code final:

from django import forms 
from housemanager.iou.models import Deuda 
from django.contrib.auth.models import User 

class DeudaForm(forms.ModelForm): 

    class Meta: 
     model = Deuda 
     exclude = ('propietario',) 

    def __init__(self, propietario): 
     d = Deuda() 
     d.propietario = propietario 
     forms.ModelForm.__init__(self, instance=d) 
     self.fields['adeudado'].queryset = User.objects.exclude(pk=propietario.pk) 
+0

ajouté le code je à la fin, grâce lazerscience – eliocs

Répondre

1

Essayez de le mettre dans __init__ de la forme:

class DeudaForm(forms.ModelForm): 

    class Meta: 
     model = Deuda 
     exclude = ('propietario',) 

    def __init__(self, propietario): 
     forms.ModelForm.__init__(self) 
     self.fields['adeudado'].queryset = User.objects.exclude(pk=d.propietario.pk) 
+0

La ligne self.fields doit être sous le constructeur parent mais ça marche en effet, merci! – eliocs

+0

Cela provoquera des problèmes lorsque vous essayez de lier le formulaire avec un POST. Assurez-vous de définir __init__ pour accepter tous les arguments: 'def __init __ (self, * args, ** kwargs): proprietario = kwargs.pop ('propietario')' –

Questions connexes