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)
ajouté le code je à la fin, grâce lazerscience – eliocs