我有一个模型,其中包含“标签”表的 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/