Разграничение выбора в ModelChoiceField - PullRequest
1 голос
/ 04 июля 2010

Я новичок в python и django, поэтому этот вопрос, вероятно, будет легко решить, но я не могу заставить его работать.В основном у меня есть модель, которая содержит два внешних ключа типа User.Я строю форму, в которой я хочу удалить один из вариантов 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)

1 Ответ

1 голос
/ 04 июля 2010

Попробуйте поместить это в форму __init__:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...