2015-09-14 98 views
1

我想在django模板中簡單顯示模型formset。我收到以下錯誤顯示formset時Django UnicodeEncodeError:ascii編解碼器不能編碼字符

enter image description here

enter image description here

這裏是我試圖顯示:實際表單集形式

enter image description here

中在view.py,在這裏是相關的代碼片段:

# 
# create Address Model Form Set 
# 
AddressFormSet = modelformset_factory(Address, form=businessForms.AddressModelForm) 

if request.method == 'GET': 

    businessModelForm = businessForms.BusinessModelForm(instance = business) 

    addressModelFormSet = AddressFormSet(queryset=Address.objects.filter(business__id=business.id)) 
    #addressModelFormSet = AddressFormSet() 

    print addressModelFormSet.is_valid() /* prints False */ 
    print addressModelFormSet.errors  /* prints [] empty list */ 

    return render(request, "business_profile.html", { 'businessModelForm' : businessModelForm, 
                 'addressModelFormSet': addressModelFormSet }) 

我認爲表單的有效性與這個錯誤無關,因爲我們檢查POST請求的有效性,但我可能是錯的。儘管對於formset沒有顯示錯誤列表。

的AddressModelForm:

class AddressModelForm(ModelForm): 

    class Meta: 
     model = Address 
     fields = ['street_address', 'address_line2', 'city', 'state', 'zip_code'] 

模型定義:

class Country(models.Model): 
    country_name = models.CharField(max_length = 50) 
    country_code = models.CharField(max_length = 2) 
    phone_code = models.CharField(max_length = 3, default = '000') 
    country_name_ar = models.CharField(max_length = 50, default = '') 

    #many-to-many fields 
    currencies = models.ManyToManyField(Currency) 

    def __str__(self): 
     return "%s" % self.country_name 

class City(models.Model): 
    city_name = models.CharField(max_length = 93) 
    city_name_ar = models.CharField(max_length = 93, default = '') 
    country = models.ForeignKey(Country) 

    def __str__(self): 
     return ("%s" % self.city_name) + "," + str(self.country) 

class Address(models.Model): 
    street_address = models.CharField(max_length = 500) 
    address_line2 = models.CharField(max_length = 500, default = '') 
    city = models.ForeignKey(City) # country included implicitly in city 
    zip_code = models.CharField(max_length = 5, default = '') 
    state = models.CharField(max_length = 2, default = '') 

    def __str__(self): 
     usStr = ("%s" % self.street_address) + "," + str(self.city) + "," + self.state + "," + self.zip_code 
     nonUsStr = ("%s" % self.street_address) + "," + str(self.city) 

     if self.state != '': 
      return usStr 
     else: 
      return usStr 

我懷疑那個城市模型city_name_ar這是城市名阿拉伯語領域的事實...

更新 如果我從AddressModelForm中刪除「城市」,或將該字段覆蓋爲CharField,我不會不會得到這個錯誤,但是,我得到的城市ID是沒用的文本字段...

+0

我懷疑你的數據庫沒有正確地存儲東西。 –

+0

@ IgnacioVazquez-Abrams請你解釋一下嗎?看到我上面的更新,當我從模型窗體中刪除城市或重寫字段以顯示文本字段時,它工作正常 –

+0

打開數據庫。檢查表格模式。檢查存儲在該字段中的字節序列。 –

回答

0

您使用的是Python 2.x.在2.x中,模型應該要麼有一個__unicode__方法,而不是或除了__str__方法,每種方法應返回合適的類型(Unicode進行__unicode__,編碼字節__str__),或者如果你」你應該使用python_2_unicode_compatible裝飾重新使用Django的最新版本。如果你打算在不久的將來繼續使用2.x,我建議你只寫__unicode__方法,而不用打擾裝飾器,因爲你串聯了字符串表示,我不太確定它是怎麼做的。

一些相關文檔是:

https://docs.djangoproject.com/en/1.8/ref/utils/#django.utils.encoding.python_2_unicode_compatible

https://docs.djangoproject.com/en/1.8/topics/python3/#str-and-unicode-methods

無論哪種方式,你應該避免不指定編碼轉換數據庫值(這是通過周圍爲Unicode對象)。一般來說,最簡單的方法只是定義返回unicode的,例如方法:

class Country(models.Model): 
    # as above, except 
    def __unicode__(self): 
     return self.country_name 

或者:

同樣,對於您的其他車型:

class City(models.Model): 
    ... 
    def __unicode__(self): 
     return self.city_name + "," + unicode(self.country) 

或(未經測試,可能需要此處也請撥打unicode(self.country)):

@python_2_unicode_compatible 
class City(models.Model): 
    ... 
    def __str__(self): 
     return self.city_name + "," + str(self.country) 
+0

感謝您的回答,但這並沒有解決它,現在python.exe崩潰,我得到訪問衝突異常(看到在Visual Studio調試器)。我用了你給出的兩個選項,結果相同 –

+0

這很奇怪。猜測中,您的數據庫中存儲的字節與表中聲明的字符集不匹配。我很驚訝,這可能會產生你正在報告的錯誤,但它不可能遠程調試。 –

相關問題