我有一个ModelForm
,其中一个字段(名为creator
)是ForeignKey
,因此对于{{ form.creator }}
,Django会像这样呈现<select>
标记:
<select id="id_approver" name="approver">
<option selected="selected" value="">---------</option>
<option value="1">hobbes3</option>
<option value="2">tareqmd</option>
<option value="3">bob</option>
<option value="4">sam</option>
<option value="5">jane</option>
</select>
但是我想添加一个onchange
事件属性,以便稍后我可以使用AJAX来做其他事情。我还想更改---------
以说出其他内容并显示批准者的全名,而不是他们的用户名。
那么是否可以获得可能的批准者列表并生成我自己的选择选项?有点像
<select id="id_approver" name="approver" onchange="some_ajax_function()">
<option select="selected" value="0">Choose a user</option>
{% for approver in form.approver.all %} <!-- This won't work -->
<option value="{{ approver.pk }}">{{ approver.get_full_name }}</option>
{% endfor %}
</select>
而且我也认为批准者的大部分名单都太大了(比如超过50个),那么我最终会想要一个可搜索的自动填写领域给批准者。那么我肯定需要编写自己的HTML。
如果有人需要,我的ModelForm
看起来像这样:
class OrderCreateForm( ModelForm ) :
class Meta :
model = Order
fields = (
'creator',
'approver',
'work_type',
'comment',
)
答案 0 :(得分:1)
ModelChoiceField documentation解释了如何执行此操作。
要更改空标签:
empty_label
By default the <select> widget used by ModelChoiceField
will have an empty choice at the top of the list. You can change the text
of this label (which is "---------" by default) with the empty_label
attribute, or you can disable the empty label entirely by setting
empty_label to None:
# A custom empty label
field1 = forms.ModelChoiceField(queryset=..., empty_label="(Nothing)")
# No empty label
field2 = forms.ModelChoiceField(queryset=..., empty_label=None)
至于你的第二个问题,它也在文档中解释:
The __unicode__ method of the model will be called to generate string
representations of the objects for use in the field's choices;
to provide customized representations, subclass ModelChoiceField and override
label_from_instance. This method will receive a model object, and should return
a string suitable for representing it. For example:
class MyModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return "My Object #%i" % obj.id
最后,要传递一些自定义ajax,请对select小部件使用attrs
参数(这是ModelForm字段中使用的参数)。
最后,你应该有这样的事情:
creator = MyCustomField(queryset=...,
empty_label="Please select",
widget=forms.Select(attrs={'onchange':'some_ajax_function()'})