2010-07-04 56 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的views.py

​​3210

所以我的想法是给用户传递到形式,以便它可以

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)) 

提取物定义一个不包含它的ModelChoiceField。 我的代码不起作用,因为在设置'adedado'时d不在范围内。我相信要实现这个目标必须有很多方法,可以随意改变我设计上的任何东西。

最终代码:

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 2010-07-04 17:49:09

回答

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

的self.fields线必须是下父构造函数,但它确实工作,谢谢! – eliocs 2010-07-04 17:41:13

+0

当您尝试使用POST绑定表单时,这会造成问题。确保你定义了__init__接受所有参数:'def __init __(self,* args,** kwargs):proprietario = kwargs.pop('propietario')' – 2010-07-04 19:19:09