我有一個(可怕的)資料庫表,它將從一個巨大的電子表格中匯入。欄位中的資料是供人使用的,并且充滿了“特殊情況”,因此它們都存盤為文本。展望未來,我想對允許用戶在某些領域投入的內容施加一點紀律。在大多數情況下,使用自定義表單驗證器很容易。
但是,有幾個欄位的人機界面應該是 ChoiceField。我可以覆寫默認的表單欄位型別(CharField)嗎?(澄清一下,模型欄位不是也不能受選項約束,因為必須存盤歷史資料。我只想通過創建視圖約束將來對表的添加)。
class HorribleTable( models.Model):
...
foo = models.CharField( max_length=16, blank=True, ... )
...
class AddHorribleTableEntryForm( models.Model)
class Meta:
model = HorribleTable
fields = '__all__' # or a list if it helps
FOO_CHOICES = (('square', 'Square'), ('rect', 'Rectangular'), ('circle', 'Circular') )
...?
uj5u.com熱心網友回復:
也許您可以手動呈現表單,通過背景關系傳遞選項并在 html 中創建欄位。
看看這里:https ://docs.djangoproject.com/en/4.0/topics/forms/#rendering-fields-manually
uj5u.com熱心網友回復:
我認為您可以輕松設定自定義表單欄位,只要它將資料型別與模型中的一組匹配(例如,不要設定比 CharField 的 max_length 長的選項等)。執行以下操作,其中 foo 與模型中的欄位名稱相同:
class AddHorribleTableEntryForm(forms.ModelForm):
foo = forms.ChoiceField(choices=FOO_CHOICES)
class Meta:
model = HorribleTable
...
我認為這對于創作形式來說是非常好的。它不適用于更新,因為資料庫中的值很可能與您的選擇不匹配。為此,我建議添加第二個表單來處理資料更新(也許有自定義權限來限制它)。
更新
另一種方法是覆寫表單的 init 方法。這樣您就可以在同一個表單中處理這兩個操作(創建和更新)。讓用戶在創建物件時從選擇欄位中進行選擇。并顯示為現有物件的普通模型欄位:
class AddHorribleTableEntryForm(forms.ModelForm):
foo = forms.ChoiceField(choices=FOO_CHOICES)
class Meta:
model = HorribleTable
fields = '__all__' # or a list if it helps
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
instance = kwargs.get("instance", None)
if instance is None:
self.fields["foo"].widget = forms.widgets.Select(choices=self.FOO_CHOICES)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/422713.html
標籤:
