簡體   English   中英

Django 模型選擇字段 - 取決於其他字段的選擇

[英]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。
  • 在您的模板中,添加一個 Javascript 綁定:當用戶選擇一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM