簡體   English   中英

django admin中帶有django-taggit字段的FilteredSelectMultiple小部件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM