我有两个型号
class Friend(models.Model):
me = models.ForeignKey(User)
friend = models.ForeignKey(User)
remark = models.CharField(max_length=15)
def __unicode__(self):
return self.remark
class Message(models.Model):
from_user = models.ForeignKey(User)
to_user = models.ForeignKey(User)
...
我为消息
制作表格class MessageForm(ModelForm):
class Meta:
model = Message
但是当我在html中显示表单时,我希望我只通过'remark'显示to_user的选择列表(在Friend模型中)
我覆盖了MessageForm的 init 方法,如下所示:
class MessageForm(ModelForm):
class Meta:
model = Message
def __init__(self,*args,**kwargs):
super(MessageForm, self).__init__(*args,**kwargs)
init = kwargs.get('initial')
if init:
if 'from_user' in init:
me = init['from_user']
self.fields['to_user'].queryset = Friend.objects.filter(me=me)
当数据发布时,form.is_valid()引发错误:无法分配“”:“Message.to_user”必须是“用户”实例。
所以我想在is_valid()被调用之前更改self.fields ['to_user']的值:
def is_valid(self):
# do something to fix the problem
super(MessageForm, self).is_valid()
答案 0 :(得分:0)
is_valid()
调用表单的clean()
方法,所以把你的黑客放在那里:
def clean(self):
# hack hack hack, operating on self.cleaned_data
return self.cleaned_data
答案 1 :(得分:0)
您的表单中需要ModelChoiceField,这将处理查找关系。