在ModelForms中使用Accents验证Django选项

时间:2015-02-05 17:13:25

标签: python django django-forms

我在Django中有这个模型:

@python_2_unicode_compatible
class Student(models.Model):
    CHOICES = (('Graduación', 'Graduación'),
               ('Baja Temporal', 'Baja Temporal'),
               ('Expulsión', 'Expulsión'))
    persona = models.OneToOneField(Persona)
    enrollemente_code = models.CharField(max_length=10, unique=True)
    prev_school = models.CharField(max_length=256, blank=True, null=True)
    medical_notes = models.TextField(null=True, blank=True)
    enrollement_date = models.DateField()
    egress_date = models.DateField(blank=True, null=True)
    egress_reason = models.CharField(max_length=64, choices=CHOICES,
                                 blank=True, null=True)
    egress_comments = models.TextField(null=True, blank=True)

    def __str__(self):
        return self.persona.get_full_name()

我创建了这个ModelForm:

class UnenrollForm(ModelForm):
    class Meta:
        model = Student

        labels = {
            'egress_date': 'Fecha',
            'egress_reason': 'Razón de Baja',
            'egress_comments': 'Comentarios',
        }

        widgets = {
        'egress_comments': Textarea(attrs={'rows': 3}),
    }

    exclude = ['persona', 'enrollemente_code', 'prev_school',
               'medical_notes', 'enrollement_date']

当我在我的View中调用unenrollform.is_valid()时,我收到此警告:

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal '==': infix(10, lambda context, x, y: x.eval(context) == y.eval(context)),

并且egress_reason字段被认为是错误的。

你知道如何验证这个吗?还是转过身来?

1 个答案:

答案 0 :(得分:1)

请注意,在CHOICES数组中,您的条目应为(code, label)。代码是Django实际在内部和DB中使用的代码,而标签纯粹是表示性的。

在这里,您遵循该惯例是有意义的。除此之外,这将使您的项目国际化更容易(如果需要)。顺便说一下,它也应该让你的问题消失:

CHOICES = (('graduated', 'Graduación'),
           ('temporary', 'Baja Temporal'),
           ('expelled', 'Expulsión'))

请注意,如果您的数据库中已有数据,那么您将不得不以某种方式迁移它。


现在,根据您使用的Python版本,确保您的非ASCII字符串被声明为unicode也是一个好主意(否则,您要将其保留为unicode) Python在运行时猜测它们的编码)。

具体来说,在Python 2中,您应该执行以下操作(在Python 3中,您不需要执行任何操作):

CHOICES = (('graduated', u'Graduación'),
           ('temporary', u'Baja Temporal'),
           ('expelled', u'Expulsión'))

另外,请确保声明文件的编码。第一行应该是:

#coding:utf-8

请注意,这假设您的文件是以utf-8编码的,但这是一个非常安全的假设。