慕容708150
2021-11-04 15:18:52
我有一個用于更新找到的項目的表格。該表單通過視圖擴展了 Django 的 UpdateView。更新丟失物品和更新找到物品的表單使用相同的模板,但具有不同的視圖和表單。它們共享相同的模板,因為大多數字段都相同。我正在嘗試為表單添加一些自定義表單驗證,以特別更新找到的項目。此驗證特定于找到的物品,不適用于丟失的物品。我在一個干凈的函數中進行了驗證,該函數FoundUpdateForm檢查是否滿足了所需的條件,如果不滿足條件,則引發 ValidationError。即使這里有驗證,我也想將它添加到 JavaScript 文件中。我曾嘗試在與表單上的元素相關聯的 JavaScript 文件中創建變量,但沒有成功。我試過使用var staff_type = document.getElementById('staff_type'),var staff_type = document.getElementById('FoundUpdateForm').elements.namedItem('staff_type')以及其他一些變體。我正在處理的主要問題是如何在沒有 ID 的情況下獲取表單。我已經研究過在 forms.py 中為表單分配一個 ID,但從我的發現來看,至少它似乎不能以這種方式完成。我想盡可能避免添加到模板中,因為如前所述,該模板被多個表單使用。此外,由于表單擴展了 UpdateView 模板,因此該模板能夠{{ form.as_p }}使用 p 標簽來呈現表單的字段。因為元素以這種方式呈現到頁面上,Django 為每個元素分配了自己的 ID,但表單本身并沒有分配一個 ID。表格.py:class FoundUpdateForm(ModelForm): Found._meta.get_field('staff_type').formfield(widget=forms.RadioSelect()) def clean(self): cleaned_data = super(FoundUpdateForm, self).clean() staff_type = cleaned_data.get('staff_type') witness = cleaned_data.get('witness') res_type = cleaned_data.get('res_type') name_of_the_individual_claiming_item = cleaned_data.get('name_of_the_individual_claiming_item') phone_number = cleaned_data.get('phone_number') if not staff_type: raise forms.ValidationError("Please fill out Type of Employee Resolving Item.") if staff_type == 'student' and not witness: raise forms.ValidationError("Student staff resolving lost items are required to have a witness.") if res_type.name == 'Picked up': if not name_of_the_individual_claiming_item: raise forms.ValidationError("If person is picking up item, the individual's name is required.") if not phone_number: raise forms.ValidationError("If person is picking up item, the individual's phone number is required.") if not witness: raise forms.ValidationError("If person is picking up item, a witness is required.") }
1 回答

FFIVE
TA貢獻1797條經驗 獲得超6個贊
將表單包裹在 a 中,<div>
并為該 div 指定一個類,例如<div class="MySpecialForm">
。然后,您可以通過引用具有該特定類的 div 中的表單來找到(django 生成的)表單(如果您想要防彈,請檢查它是否唯一)。通常,將某些內容包裝在 div 中對其顯示沒有影響,除非 div 類對于某些內容(例如 Bootstrap)而言是特殊的。$('div.MySpecialForm form')
(或者更接近的東西,我不會經常使用 JQuery 選擇器來獲得關于它們的知識?。?/p>
除非頁面中可能有 >1 個表單,否則您不需要這個,但是如果您嘗試編寫盡可能通用的 JS,您確實應該考慮這種可能性。
您還應該考慮模板和子模板,使用定義相對于任何特定視圖和一些空塊(或顯示“編程錯誤,您忘記覆蓋塊 foobar”的塊)不變的部分的基本模板。子模板做
{% extends "wherever/whatever.html" %} {% block something %} stuff {% endblock something %} {% block something_else %} 等等...
這巧妙地將一個視圖的細節與特定類型視圖的泛型區分開來。
添加回答
舉報
0/150
提交
取消