首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用django-select2 2管理标记

用django-select2 2管理标记
EN

Stack Overflow用户
提问于 2013-09-11 13:57:24
回答 2查看 3.1K关注 0票数 3

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

代码语言:javascript
复制
tags = ModelSelect2MultipleField(queryset=Tag.objects, required=False)

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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-16 14:31:24

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

代码语言:javascript
复制
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)

下面是一个使用的小例子。

票数 2
EN

Stack Overflow用户

发布于 2019-09-03 05:17:45

这就是我和django-select2==7.1.1一起工作的地方

代码语言:javascript
复制
#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而过度使用。

代码语言:javascript
复制
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()
        })
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18743253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档