Django:在提交之前修改字段值

时间:2015-05-29 21:25:33

标签: django django-forms

要解决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()
        }

2 个答案:

答案 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()时都会。