복붙노트

[PYTHON] 장고 관리자의 다른 선택 필드를 기반으로 선택 필드 옵션을 제한하는 방법

PYTHON

장고 관리자의 다른 선택 필드를 기반으로 선택 필드 옵션을 제한하는 방법

나는 다음과 같은 모델을 가지고있다 :

class Category(models.Model):
    name = models.CharField(max_length=40)

class Item(models.Model):
    name = models.CharField(max_length=40)
    category = models.ForeignKey(Category)

class Demo(models.Model):
    name = models.CharField(max_length=40)
    category = models.ForeignKey(Category)
    item = models.ForeignKey(Item)

관리자 인터페이스에서 새 데모를 만들 때 사용자가 드롭 다운에서 카테고리를 선택하면 "항목"드롭 다운의 선택 수를 제한하고 싶습니다. 사용자가 다른 카테고리를 선택하면 그에 따라 항목 선택 항목이 업데이트되어야합니다. 서버에서 양식 유효성 검사를 수행하기 전에 클라이언트에서 항목 선택을 제한하고 싶습니다. 이것은 항목 목록이 1000+ 이상이면 항목을 범주별로 좁힐 수 있으므로 관리 편의성을 높일 수 있습니다.

그것을 수행하는 "장고 (django-way)"가 있습니까? 아니면 커스텀 JavaScript가 유일한 옵션입니까?

해결법

  1. ==============================

    1.카테고리 변경시 항목 옵션 값을 변경하는 자바 스크립트 (JQuery 기반)는 다음과 같습니다.

    카테고리 변경시 항목 옵션 값을 변경하는 자바 스크립트 (JQuery 기반)는 다음과 같습니다.

    <script charset="utf-8" type="text/javascript">
      $(function(){
        $("select#id_category").change(function(){
          $.getJSON("/items/",{id: $(this).val(), view: 'json'}, function(j) {
            var options = '<option value="">--------&nbsp;</option>';
            for (var i = 0; i < j.length; i++) {
              options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
            }
            $("#id_item").html(options);
            $("#id_item option:first").attr('selected', 'selected');
          })
          $("#id_category").attr('selected', 'selected');
        })
      })
    </script>
    

    유효한 항목의 JSON 목록을 제공하는 / items / URL에서 호출 할보기가 필요합니다.

    모델 admin 미디어 정의를 사용하여이를 관리자에게 연결할 수 있습니다.

  2. ==============================

    2.django-smart-select가 있습니다 :

    django-smart-select가 있습니다 :

    다음 모델이있는 경우 :

    class Location(models.Model)
        continent = models.ForeignKey(Continent)
        country = models.ForeignKey(Country)
        area = models.ForeignKey(Area)
        city = models.CharField(max_length=50)
        street = models.CharField(max_length=100)
    

    그리고 여러분이 대륙을 선택한다면이 대륙에 위치한 국가들만 사용할 수 있고 다음과 같은 분야에 대해서도 똑같이 할 수 있기를 바랍니다 :

    from smart_selects.db_fields import ChainedForeignKey 
    
    class Location(models.Model)
        continent = models.ForeignKey(Continent)
        country = ChainedForeignKey(
            Country, 
            chained_field="continent",
            chained_model_field="continent", 
            show_all=False, 
            auto_choose=True
        )
        area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country")
        city = models.CharField(max_length=50)
        street = models.CharField(max_length=100)
    
  3. ==============================

    3.JavaScript / AJAX가이 문제에 대한 최선의 방법이라고 생각합니다.

    JavaScript / AJAX가이 문제에 대한 최선의 방법이라고 생각합니다.

  4. ==============================

    4.객체를 필터링하는 비 서버 기반 메커니즘을 사용해야합니다. 어느 쪽이든, 또는 선택이 이루어지면 페이지를 다시 불러올 수 있습니다 (어쨌든 JavaScript로 처리 될 가능성이 있습니다).

    객체를 필터링하는 비 서버 기반 메커니즘을 사용해야합니다. 어느 쪽이든, 또는 선택이 이루어지면 페이지를 다시 불러올 수 있습니다 (어쨌든 JavaScript로 처리 될 가능성이 있습니다).

    그렇지 않으면 서버에서 클라이언트로 데이터의 하위 집합을 가져올 수 없습니다.

  5. from https://stackoverflow.com/questions/796466/how-to-limit-choice-field-options-based-on-another-choice-field-in-django-admin by cc-by-sa and MIT license