2017-08-19 64 views
0

我有點困惑,因爲我認爲它會成爲Django驗證的一部分......我在1.8版本上,因爲我使用的是較舊的數據庫連接庫,最後測試了1.8(重寫舊數據的前端)。Django POST驗證將字符串視爲字符串

models.py:

class Order(models.Model): 
    #rest of class# 
    RequestorNumber = models.SmallIntegerField(db_column='requestor_no') 

class Requestor(models.Model): 
    RequestorNumber = models.SmallIntegerField(primary_key=True, db_column="requester_no") 
    Requestor = models.CharField(max_length=20, db_column = "requester") 

    def __str__(self): 
     return self.Requestor 

forms.py

class OrderForm(forms.ModelForm): 
RequestorNumber = forms.ModelChoiceField(queryset=Requestor.objects.all().order_by('RequestorNumber'), label="Requestor") 

因此,這會在模板正確的下拉列表中,其值作爲整數和文本描述例如:

<option value="1" selected="selected">JOHN DOE</option> 

提交表單時,POST QueryDict在打印整個請求時有一個正確的條目:

... 
'OrderForm-RequestorNumber': ['1'] 
... 

但這進來作爲一個字符串(如我所期望的),但這樣做is_valid時()驗證踢背部和網頁獲得:

「李四」的值必須是整數。

這是設計嗎?我覺得它試圖忽略爲窗體選擇的值並將對象的__str__定義作爲需要保存的內容。如果這是愚蠢的,我也想知道什麼是更正確的方法,唯一的問題是我無法更改數據庫架構,並且所有表都在元中被管理= False。

編輯:我重寫了表格中的clean_RequestorNumber,以字面輸出它認爲應該保存的值,並且它給出了方法__str__的值而不是主鍵。

我需要改變這種行爲,但是我不能確定在進行驗證的源代碼中的位置。在models.py,fields.py和widgets.py之間,我可以看到必需的,valid_choice和其他驗證,但是我無法找到這個被推送的位置。一旦我發現它,我可以嘗試寫我自己的課程,但我無法弄清楚要重寫什麼。

+0

爲什麼您的RequestorNumber字段不是ForeignKey? –

+0

我正在使用的數據庫模式實際上沒有關鍵定義(直接從1993年開始)。我不確定django會發生什麼情況,如果我在一個字段上定義了一個外鍵並且沒有定義db_column屬性,並且遠端的數據庫沒有外鍵在該字段中的概念(並且只有值) 。 – zudebluvstein

回答

0
class OrderForm(forms.ModelForm): 
def __init__(self, *args, **kwargs): 
    super(OrderForm, self).__init__(*args, **kwargs) 
    self.fields['RequestorNumber'].choices = [(x.pk, x.Requestor) for x in Requestor.objects.all()] 

RequestorNumber = forms.ChoiceField() 

ModelChoiceField之前做舊的方式是一件事正確驗證。不知道這是否修復過1.8,但我仍然無法在源代碼中找到會爲驗證提供不正確行爲的位置。如果有人能指出我正確的方向,我會很高興,因爲我仍然寧願修復我的版本,所以我可以有一些更清晰的代碼來處理。如果有人能夠幫助,然後只是將其標記爲答案,那麼請留下一週的時間。