2010-07-04 100 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

相關問題