我在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字段被认为是错误的。
你知道如何验证这个吗?还是转过身来?
答案 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
编码的,但这是一个非常安全的假设。