[英]Django model choice field - depend on other field's choice
我需要帶有 2 個字段的 django modelform,其中第二個字段選擇列表取決於在第一個字段中選擇的內容。 我的型號:
class Offer(BaseModel):
VEHICLE_TYPES = (
('personal','Personal car'),
('truck','Truck'),
)
vehicle_type = models.CharField(max_length=32, choices=VEHICLE_TYPES, default='personal', verbose_name='Vehicle type')
PERSONAL_MAKES = (
('',''),
)
TRUCK_MAKES = (
('',''),
)
make = models.CharField(max_length=32)#what more??
如果 Vehicle_type 設置為個人,如何將make字段的選擇設置為PERSONAL_MAKES ? 我怎樣才能做到這一點? 在模型級別上可以嗎?
您可能不能,因為這取決於用戶與表單的交互:在將表單發送到瀏覽器之前,您的服務器無法提前知道您的用戶將選擇哪個元素。 您可能可以使用 ajax 來實現這一點。 我認為一個工作過程可能是:
make
領域隱藏AjaxMakeFieldView
),該視圖將捕獲采用vehicle_type
參數的 ajax 請求並返回make field
的 HTML, make field
填充相關數據。 在您的 URLConf 中為此視圖添加一個 URL。vehicle_type
,瀏覽器將向AjaxMakeFieldView
發送一個 ajax 請求並用返回的 HTML 替換隱藏的make
字段如果您不想要 javascript,另一種方法是兩步式:
vehicle_type
字段的第一個表單make
字段的第二個表單,根據第一個表單中選擇的vehicle_type
填充初始數據。我從來沒有這樣做過,但是關於表單向導的 Django 文檔似乎是一個很好的起點。
這就是我最終在一頁上有兩個相互依賴的模型選擇字段的方式。 在下面, field2
取決於field1
:
Javascript 部分
請注意,在$.each()
,不應使用$.parseJSON(resp)
(而不僅僅是json
),因為我們已經通過 jQuery 解析了它(由於 content_type='application/json' 響應) - 請參閱我不斷收到 "Uncaught SyntaxError: Unexpected token o" 。
$(document).ready(function() {
$("#id_field2").empty();
$("#id_field1").change(function(){
$.ajax({
url: "{% url 'ajax_get_field_2' %}",
type: 'GET',
data: {field1_id: $("#id_field1").val()},
dataType: "json",
success: function(resp){
$("#id_field2").empty();
$.each(resp, function(idx, obj) {
$('#id_field2').append($('<option></option>').attr('value', obj.pk).text(obj.fields.code + ' (' + obj.fields.affection + ')'));
});
},
error: function(jqXHR, textStatus, errorThrown) {
alert(errorThrown);
}
});
});
});
Django views.py 部分
請注意,這也可以通過 django-rest-framework 來完成。 我正在從MyModel2
獲取fields=('id', 'code', 'affection'))
- 然后可以使用obj.fielsd.<myfieldname>
在 JQuery 中obj.fielsd.<myfieldname>
這些obj.fielsd.<myfieldname>
。
class AjaxField2View(generic.View):
def get(self, request, *args, **kwargs):
field_1 = get_object_or_404(MyModel1, pk=request.GET.get('field1_id', ''))
model2_results = MyModel2.objects.filter(k_value=field_1 .k_value)
return HttpResponse(serializers.serialize('json', model2_results, fields=('id', 'code', 'affection')), content_type='application/json')
另一種智能方法查詢/免費,不需要視圖,
是為與字段 A 選擇相關的選項制作 html 標簽。
例如,在字段 B 選項中:
<option example_tag="example_value" value="5"></option>
此標記應與字段 A 值或文本相關。
使用 JS 相應地使用此選項標簽顯示塊/無。
並且不要忘記每次用戶更改字段 A 時重置值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.