要解决Taggit的问题,我尝试在标记字段中的值之前添加引号,然后再将它们转移到模型中。这是我到目前为止所做的,但它不起作用。我做错了什么?
class TagField(models.CharField):
description = "Simplifies entering tags w/ taggit"
def __init__(self, *args, **kwargs):
super(TagField, self).__init__(self, *args, **kwargs)
# Adds quotes to the value if there are no commas
def to_python(self, value):
if ',' in value:
return value
else:
return '"' + value + '"'
class CaseForm(forms.ModelForm):
class Meta:
model = Case
fields = ['title', 'file', 'tags']
labels = {
'file': 'Link to File',
'tags': 'Categories'
}
widgets = {
'tags': TagField()
}
答案 0 :(得分:0)
您是models.CharField
的子类,而应该是forms.CharField
的子类,您在表单中指定了widget属性,但是您正在尝试创建表单字段的子类。
答案 1 :(得分:0)
这不起作用的原因是您正在定义自定义模型字段,然后尝试将其指定为窗体中的窗口小部件。如果您确实需要自定义窗口小部件,则需要实际提供窗口小部件实例,而不是模型字段实例。
但要获得所需的行为,您需要将Model级别的字段声明为自定义字段类的实例。
尝试类似 -
from django.db import models
class TagField(models.CharField):
description = "Simplifies entering tags w/ taggit"
def __init__(self, *args, **kwargs):
super(TagField, self).__init__(*args, **kwargs)
# Adds quotes to the value if there are no commas
def to_python(self, value):
if any( x in value for x in (',', '"') ):
return value
else:
return "\"%s\"" % value
class ModelWithTag(models.Model):
tag = TagField(max_length = 100)
to_python方法也由Model.clean()调用,在表单验证期间调用,因此我认为这将提供您需要的行为。
注意,我还会检查你的条件是否存在to_python方法中的双引号,否则报价将继续"叠加"每次调用save()时都会。