[英]FilteredSelectMultiple widget with django-taggit field in django admin
我正在嘗試使用django-taggit's
軟件包將Tags
添加到我的模型實例中。 為此,我在django-taggit's
定義中定義的模型中添加了tags
字段。
class MyModel(models.Model):
name = models.CharField(max_length=100)
tags = TaggableManager()
我想將此模型添加到django-admin面板,並想使用FilteredSelectMultiple小部件添加標簽。 為此,我創建了一個模型表單並更改了它的字段小部件。
class MyModelForm(forms.ModelForm):
tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.none())
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields['tags'].widget = FilteredSelectMultiple('Tags', False)
self.fields['tags'].queryset = Tag.objects.all()
class Meta:
model = MyModel
exclude = []
類MyModelAdmin(admin.ModelAdmin):form = MyModelForm
一切正常。 保存實例后將保存標簽。 但是問題是當我打開更新頁面時。 字段小部件的``選擇標簽''部分沒有先前選擇的標簽,該標簽為空,所有選項均在``可用標簽''選項中。
我也嘗試為模型admin的change_form
提供初始數據,但對我沒有任何幫助。
def get_changeform_initial_data(self, request):
return {'tags': self.object.tags.all()}
self.object
是我通過ModelAdmin
類的get_object()
方法獲得的ModelAdmin
。
給我一個解決方案。
似乎問題在於,ModelMultipleChoiceField中的prepare_value函數查看對象上的.pk字段,該字段給出的值不正確,因此不會呈現(或呈現錯誤的選擇)。 您應該查看它的.tag_id字段。
這對我有用,但是如果有更正確或更優雅的方法,可能會感興趣:
class TagMultipleChoiceField(forms.ModelMultipleChoiceField):
def prepare_value(self, value):
if hasattr(value, 'tag_id'):
return value.tag_id
elif hasattr(value, '__iter__') and not isinstance(value, six.text_type) and not hasattr(value, '_meta'):
return [self.prepare_value(v) for v in value]
else:
return super(TagMultipleChoiceField, self).prepare_value(value)
class AdminCourseForm(forms.ModelForm):
class Meta:
model = Course
exclude = ()
tags = TagMultipleChoiceField(queryset=MyTag.objects.all())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.