2010-07-04 3 views
1

Я новичок в 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) 
+0

добавил код, я использовал в конце концов, благодаря lazerscience – eliocs

ответ

1

Попробуйте поставить его в __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) 
+0

The self.fields линии должен быть под родительский конструктор, но он действительно работает, спасибо! – eliocs

+0

Это вызовет проблемы при попытке привязать форму с помощью POST. Убедитесь, что вы определили __init__, чтобы принять все аргументы: 'def __init __ (self, * args, ** kwargs): proprietario = kwargs.pop ('propietario')' –

Смежные вопросы