带有CharField的Django Model如果以字符串形式引用则会出现unicode错误

时间:2017-08-08 03:25:12

标签: django unicode django-models

这是我使用名为modelQuizQuestion的模型的表单。此模型中包含char字段。现在一切正常,如果该模型中的char字段没有引号。否则我会在form.is_valid()

上获得例外

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

class DynamicQuizForm(forms.Form):
    def __init__(self, patient, *args, **kwargs):
        super(DynamicQuizForm, self).__init__(*args, **kwargs)

        question_qset = modelQuizQuestion.objects.filter(patient=patient)
        counter = 0
        for question in question_qset:
            counter+=1
            #Construct choices
            choice_qset = modelQuizChoice.objects.filter(question=question)
            main_choices = []
            for choice in choice_qset:
                small_choices = []
                small_choices.append(choice.choice)
                small_choices.append(choice.choice)
                main_choices.append(small_choices)

                self.fields[question.question] = forms.ChoiceField(choices=main_choices, widget=forms.RadioSelect(),)

这就是我使用它的方式

 if request.method == "POST":
    quizForm = DynamicQuizForm(patient=patient_qset, data=request.POST)
    if quizForm.is_valid(): #<------------ gives exception here
           .....

为什么会发生这种情况的任何建议。 我看了这两个链接 link1link2

然而,似乎这是一个unicode问题,答案建议使用decode代替str。在我的代码中,我没有在任何地方使用str

更新

我认为这个问题的原因是因为声明

self.fields[question.question] = forms.ChoiceField(choices=main_choices, widget=forms.RadioSelect(),)

仅当question.question中包含带撇号的字符串时才会出现此情况。

这是问题模型

class modelQuizQuestion(models.Model):
    patient = models.ManyToManyField(modelPatient,default=None,blank=True)
    question = models.CharField(max_length=800, unique=True)

    class Meta:
        verbose_name_plural = "Questions in the Quizes"

    def __unicode__(self):
        return "Question : " +self.question

有关我如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:0)

在所有文件的第一行输入:

# -*- coding: utf-8 -*-

尝试实现以下类:

class modelQuizQuestion(models.Model):
    patient = models.ManyToManyField(modelPatient,default=None,blank=True)
    question = models.CharField(max_length=800, unique=True)

    class Meta:
        verbose_name_plural = "Questions in the Quizes"

    def __str__(self):
        return "Question: %s" % self.question

如果您正在使用python 3并且希望它与python 2兼容,请使用装饰器python2_unicode_compatible

from django.utils.encoding import python2_unicode_compatible

@python2_unicode_compatible
class modelQuizQuestion(models.Model): ...

如果您还有其他问题,请查看Django的文档。我建议你看一下 str ()和 unicode ()

之间的选择

https://docs.djangoproject.com/pt-br/1.11/ref/unicode/