代码之家  ›  专栏  ›  技术社区  ›  eliocs

在ModelChoiceField中分隔选项

  •  1
  • eliocs  · 技术社区  · 16 年前

    我对python和django都不熟悉,所以这个问题可能很容易解决,但我无法解决。 基本上我有一个包含两个用户类型的外键的模型。我正在构建一个表单,在该表单中,我希望基于另一个字段删除ModelChoiceField的一个选项。我希望用户不能在表单中选择自己。 我的代码。

    模特儿

    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
    

    表单

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

    视图提取.py

    [...]
    form = DeudaForm(request.user)
    

    因此,我的想法是将用户传递到表单,以便它可以定义不包含该表单的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)
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Bernhard Vallant    16 年前

    试着把它放在表格里 __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)