我有以下ModelForm并且我得到了我想要的结果,但我无法弄清楚如何从结果中删除密钥。
形式:
class TicketActionsForm(ModelForm):
assign = forms.ModelChoiceField(queryset=Users.objects.values('user').filter(account=3), empty_label=" Select Admin ")
查看退货声明:
return render_to_response('tickets/view.html',
{'ticket':ticket,'ticketactions':TicketActionsForm()},
context_instance=RequestContext(request)
)
模板:
{{ ticketactions.assign }}
结果:(截图:http://snapplr.com/z7t7)
<option value="" selected="selected"> Select Admin </option>
<option value="{'user': u'Chris'}">{'user': u'Chris'} </option>
<option value="{'user': u'mmiller'}">{'user': u'mmiller'}</option>
<option value="{'user': u'millerm'}">{'user': u'millerm'}</option>
<option value="{'user': u'Cindy222'}">{'user': u'Cindy222'}</option>
编辑:
我可以通过以下覆盖轻松更新标签,但我仍然偶然发现如何更改选项值。我可以在POST后修改数据,但我宁愿在此之前清理它。
class UserModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return obj['user']
分辨率:
我最后在 init 中做了一些黑客,以获得我想要的结果。
def __init__(self, *args, **kwargs):
super(TicketActionsForm, self).__init__(*args, **kwargs)
newChoices = []
for item in self.fields['assign'].queryset:
choice=(item['user'],item['user'])
newChoices.append(choice)
self.fields['assign'].choices = newChoices
答案 0 :(得分:1)
This answer有一种简单的方法可以更改ModelChoiceField中使用的标签。
当您使用ModelChoiceField时,您可能想要调用Users.objects.all()
而不是Users.objects.values('user')
。
您想要做的是拥有以下代码:
class UserModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return obj.get_full_name()
当您制作表单时,您应该拥有以下代码:
class TicketActionsForm(ModelForm):
assign = forms.ModelChoiceField(queryset=Users.objects.all().filter(account=3), empty_label=" Select Admin ")
这样,一组(更准确地说,一个QuerySet
)行被传递给ModelChoiceField对象,并且它可以访问所有字段。使用上面的代码,您可以控制标签,当您将objects.values('user').filter
更改为objects.all().filter
时,value
标记的<option>
属性将成为id
的{{1}}排。然后,您可以使用id
或request.POST
中的传入request.GET
将其作为您喜欢的任何其他字段存储在数据库中,方法是运行查询。但是,在大多数情况下,您可能希望将其作为id
存储在数据库中。