使用 django-select2 管理标签

Posted

技术标签:

【中文标题】使用 django-select2 管理标签【英文标题】:Manage tag with django-select2 【发布时间】:2013-09-15 14:23:18 【问题描述】:

我们将django-select2 用于管理标签的工作项目。所以现在我们这样使用:

tags = ModelSelect2MultipleField(queryset=Tag.objects, required=False)

所以它只适用于现有标签,但它会更接近模型***,如果标签不存在它添加,我发现这个链接Tagging with AJAX in select2允许管理侧js,我想知道如果可以使用 django-select2 中的选项将其添加到生成的 js 中。我还想知道是否可以在 get_form_kwargs 中使用不同的字段和侧视图而不是使用 id 我创建一个 get_or_create。

谢谢

【问题讨论】:

这是一项新的增强功能 - github.com/applegrew/django-select2/issues/33。这是待办事项列表,但我不能保证时间表。如果有人能就此提供帮助,我将不胜感激。 您可以使用js_option 参数查看django-select2-forms。与***.com/a/14841968/186202 混合使用应该是一个好的开始。或者您可以在django-select2 上进行 PR 【参考方案1】:

Applegrew 发布了一个新版本,该版本使用表中不存在时创建的标签来实现标签的管理。所以使用 AutoModelSelect2TagField:

from django_select2 import AutoModelSelect2TagField


class TagChoices(AutoModelSelect2TagField):
    queryset = Tag.objects
    search_fields = ['name__icontains']

    def get_model_field_values(self, value):
        return 'name': value 


class SimpleForm(forms.ModelForm):
    tags = TagChoices(required=False)

这是一个使用的小例子。

【讨论】:

AutoModelSelect2TagField 已替换为 ModelSelect2TagWidget -django-select2.readthedocs.io/en/latest/… from django_select2.forms import ModelSelect2TagWidget【参考方案2】:

这对我有用 django-select2==7.1.1

#models.py

from django.db import models


class Tag(models.Model):
    name = models.CharField(('Name'), max_length=255, unique=True)

    def __str__(self):
        return self.name


class Article(models.Model):
    title = models.CharField(max_length=255)
    tags = models.ManyToManyField('Tag', blank=True)

#forms.py

from django_select2.forms import ModelSelect2TagWidget


class ArticleTagSelect2TagWidget(ModelSelect2TagWidget):
"""
Widget class for auto populate, edit & add tags.
"""
queryset = Tag.objects.all()
search_fields = ('name__icontains',)

@property
def empty_label(self):
    return 'Type in tags'

def value_from_datadict(self, data, files, name):
    '''Create objects for given non-pimary-key values. Return list of all names as name is the to_field_name.'''
    values = set(super().value_from_datadict(data, files, name))
    # This may only work for Tag, if Tag has title field.
    # You need to implement this method yourself, to ensure proper object creation.
    names = self.queryset.filter(**'name__in': list(values)).values_list('name', flat=True)
    cleaned_values = list(names)
    for val in values - set(list(names)):
        cleaned_values.append(self.queryset.create(name=val).name)
    return cleaned_values

class AddArticleForm(forms.ModelForm):
    tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.all(),
    widget=ArticleTagSelect2TagWidget(data_view='dashboard:auto-json'),
    required=False, to_field_name='name',)

    class Meta:
        model = Article

#views.py AutoResponseView 被覆盖以使 ajax 返回名称而不是 id。

from django_select2.views import AutoResponseView


   class TagAutoResponseView(AutoResponseView):

    def get(self, request, *args, **kwargs):
        """
        This method is overriden for changing id to name instead of pk.
        """
        self.widget = self.get_widget_or_404()
        self.term = kwargs.get('term', request.GET.get('term', ''))
        self.object_list = self.get_queryset()
        context = self.get_context_data()
        return JsonResponse(
            'results': [
                
                    'text': self.widget.label_from_instance(obj),
                    'id': obj.name,
                
                for obj in context['object_list']
                ],
            'more': context['page_obj'].has_next()
        )

【讨论】:

TagAutoResponseView 应该放在哪个views.py 中?是myapp.views吗? 你可以放入任何views.py。您只需要引用 urls.py 中的视图并调用该 url。放入适合您需要的应​​用程序。 我现在已经把它放在myapp.views。如何在myapp.urls 中引用此视图?喜欢path('', TagAutoResponseView, name='auto-json')path 中的第一个参数实际上应该是什么?是“标签/auto.json”吗?谢谢回复! 不幸的是,在设置了视图和表单后,我在添加表单中的tags 字段仅显示“0 项”。不像普通的 select2 小部件:( 我很困惑为什么“标签”字段显示“0 项”?我已经为 Tag(即 Tag.objects.all())设置了正确的 QuerySet,并且我正在使用 django-taggit

以上是关于使用 django-select2 管理标签的主要内容,如果未能解决你的问题,请参考以下文章

django-select2 不能在 django-admin 中使用内联

使用 django-select2 获取带有图片的下拉列表

django-select2 基于类或基于函数的视图

使用 django-select2 的表单的 NoReverseMatch

如何在django-select2中使用django-filter?

如何使用静态数据预填充 AutoModelSelect2Field? (django-select2 库)