我有點困惑,因爲我認爲它會成爲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和其他驗證,但是我無法找到這個被推送的位置。一旦我發現它,我可以嘗試寫我自己的課程,但我無法弄清楚要重寫什麼。
爲什麼您的RequestorNumber字段不是ForeignKey? –
我正在使用的數據庫模式實際上沒有關鍵定義(直接從1993年開始)。我不確定django會發生什麼情況,如果我在一個字段上定義了一個外鍵並且沒有定義db_column屬性,並且遠端的數據庫沒有外鍵在該字段中的概念(並且只有值) 。 – zudebluvstein