django - 在 ModelForm 的 Charfield 中显示以逗号分隔的 ManyToMany 项目列表

标签 django forms manytomanyfield csv

我有一个模型,其中包含“标签”表的 ManyToMany 字段。由于这个表可能很大,我不想在表单中显示一个选择,而是一个逗号分隔的标签列表,由 charfield 提供(我想)。

在保存时,我会用逗号分隔列表,然后将它们一一添加(使用 get_or_create)。我已经这样做了。

但是当我想更改数据时,我没有标签列表,而是 ID 列表。

如何显示逗号分隔的标签列表?我是否必须为此创建一个新的特定字段?还是已经有一些东西可以满足我的需求?

感谢您的帮助!

最佳答案

您需要创建一个自定义小部件(我不知道内置小部件可以完全满足您的需求)。最有用的示例可能是 Django 附带的小部件(在 forms/widgets.py 中)。您还可以查看创建自定义小部件的示例 here .

我做了一些小改动,在调整了内置的 Input 小部件之后,这就是我想出的;我做了一些测试,它对我有用:

class CommaTags(Widget):
    def render(self, name, value, attrs=None):
        final_attrs = self.build_attrs(attrs, type='text', name=name)
        objects = []
        for each in value:
            try:
                object = Tag.objects.get(pk=each)
            except:
                continue
            objects.append(object)

        values = []
        for each in objects:
            values.append(str(each))
        value = ', '.join(values)
        if value: # only add 'value' if it's nonempty
            final_attrs['value'] = force_unicode(value)
        return mark_safe(u'<input%s />' % flatatt(final_attrs))

请注意,在此示例中,小部件被硬编码为使用假设的 Tag 模型,它只是使用每个对象的 str() 方法,如将显示的那样在以逗号分隔的列表中。您可能希望更改这些以适合您的使用。另外,我直接在 forms/widgets.py 中有这个,所以如果你把它放在其他地方(你可能应该这样做),你需要导入一些我用过的东西。

创建后,您可以将其指定为表单中 ModelMultipleChoiceField 的小部件,如下所示:

from django import forms

class TagForm(forms.ModelForm):
    tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.all(),
                                          widget=CommaTags)
    class Meta:
        model = Tag

关于django - 在 ModelForm 的 Charfield 中显示以逗号分隔的 ManyToMany 项目列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4960445/

相关文章:

python - Django 自定义文件存储系统

django - 连接 django-rq 时出错 : ImportError: cannot import name get_failed_queue

python - Django 查询集 : how to get items after a particular id in the queryset

html - 简单的密码拼写错误真的是 HTTP 错误吗?

django - 我的 Django 许多字段都标记为唯一,是否有选项可以删除它?

python - 在每次 Django 测试之前初始化 MEDIA_ROOT

html - 如何使用 CSS 将此表单居中放置在页脚中?

javascript - 如何使用按钮显示表单中的文本?

Django: "limit_choices_to"不适用于 ManyToManyField

Django数据库访问优化: Efficient creation of many-to-many relationships (between existing objects)