Я новичок в python и django, поэтому этот вопрос, вероятно, будет легко решить, но я не могу заставить его работать. В основном у меня есть модель, которая содержит два внешних ключа типа пользователя. Я создаю форму, в которой я хочу удалить один из вариантов ModelChoiceField на основе другого поля. Я хочу, чтобы пользователь не смог выбрать себя в форме. Мой код.Ограничение выбора в 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))
экстракт views.py
[...]
form = DeudaForm(request.user)
Так что моя идея заключается в том, чтобы передать пользователю форму, чтобы он мог определите ModelChoiceField, который не включает его. Мой код не работает, потому что d не входит в область действия при установке «adedado». Я уверен, что должно быть много способов достижения этой цели, не стесняйтесь ничего менять по моему дизайну.
Окончательный код:
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)
добавил код, я использовал в конце концов, благодаря lazerscience – eliocs