如何有条件地渲染

时间:2014-09-19 23:26:28

标签: django django-forms

模特:

class Human(models.Model):
  UNIQUE = models.CharField(max_length=10)
  name = models.CharField(max_length=30)
  father = models.ForeignKey('Human', related_name = "fathers_children", null=True, blank=True)
  mother = models.ForeignKey('Human', related_name = "mothers_children", null=True, blank=True)

  def __unicode__(self):
    return "%s" % name


class Person(Human):
  email = models.EmailField()

现在,我正试图制作ModelForm:

class PersonForm(ModelForm):
  class Meta:
    model = Person
    fields = ('UNIQUE','name','email')

直到这个 - 工作完美。

现在我想添加两个字段:父亲和母亲

如果Person已经拥有父亲(和/或母亲) - 只需显示姓名。如果不是 - 显示输入字段(或两个字段),用户必须键入UNIQUE。

已更新

class PersonForm(ModelForm):
  class Meta:
    model = Person
    fields = ('UNIQUE','name','email')
    widgets = {
      'father' :forms.TextInput(),
      'mother' :forms.TextInput(),
    }

此解决方案将Select更改为TextInput,这是非常好的一步。但现在我看到父亲/母亲的身份没有名字(在Select中看到)。

=====================期待什么======================= =========== 一小块图形:

案例1:人没有父母

UNIQUE: [AAA]
name:   [John Smith    ]
email:  [john@smith.com]
father: [              ]
mother: [              ]

案例2:人有父亲

UNIQUE: [BBB]
name:   [Kate Late     ]
email:  [              ] 
father: Mike Tyson
mother: [              ]

案例3:人有父母双方

UNIQUE: [CCC           ]
name:   [Jude Amazing  ]
email:  [jude@aol.com  ]
father: James Bond
mother: Alice Spring

案例4:在人[AAA](案例1)中,用户键入母亲:[BBB]

UNIQUE: [AAA           ]
name:   [John Smith    ]
email:  [john@smith.com]
father: [              ]
mother: Kate Late

(我希望你能看到[Kate Late]和Kate Late之间的区别(没有[])

1 个答案:

答案 0 :(得分:0)

天堂的下一步:

我从表单中删除父亲和母亲,覆盖 init 并添加另外两个字段:father_input和mother_input

class PersonForm(ModelForm):
  def __init__(self, *args, **kwargs):
    super(PersonForm, self).__init__(*args, **kwargs)
    instance = getattr(self, 'instance', None)
    if instance and instance.pk:             
      if instance.father is not None:
        self.fields['father_input'].initial = self.instance.father
        self.fields['father_input'].widget.attrs['disabled'] = True

      if instance.mother is not None:
        self.fields['mother_input'].initial = self.instance.mother
        self.fields['mother_input'].widget.attrs['disabled'] = True

  father_input = forms.CharField(required = False)
  mother_input = forms.CharField(required = False)

  class Meta:
    model = Person
    fields = ('UNIQUE','name','email')

所以,现在问题的1/2已经解决 - 当母亲/父亲被定义时 - 它在不可编辑的字段中显示父亲的名字。

现在是时候为进入UNIQUE提供服务了:

字段父/母输入可以包含任何文本 - 它现在不由服务器提供。所以我必须添加

def clean_mother_input():
  data = self.cleaned_data['mother_input']
  if data == '':
    return data # do nothing
  try:
    mother = Person.objects.get(UNIQUE=data)
    logger.debug("found!")
    self.cleaned_data['mother'] = mother
    return data
  except ObjectDoesNotExist:
    raise forms.ValidationError("UNIQUE not found")

(父亲也一样)

但我也把父亲和母亲加回到Class meta,因为没有它,设置self.cleaned_data ['mother']什么都不做。

  class Meta:
    model = Person
    fields = ('UNIQUE', 'name','email','father','mother')
    widgets = {
      'father': forms.HiddenInput(),
      'mother': forms.HiddenInput(),
    }

它运行良好,但删除hiddeninputs是完美的 - 在html源代码中显示father_id并不好。但就目前而言,我不知道如何在没有hiddeninput的情况下将数据发送到模型