模特:
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之间的区别(没有[])
答案 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的情况下将数据发送到模型