Как создать и связать выпадающие списки в Django?

  • 29 августа 2023 г. 14:06
Ответы на вопрос 2
Для реализации связанных выпадающих списков в админке Django можно использовать JavaScript, чтобы фильтровать подкатегории на основе выбранной категории.

1. Создайте шаблон JavaScript, который будет выполнять AJAX-запрос для получения подкатегорий на основе выбранной категории. Например, создайте файл `subcategory_ajax.js` со следующим содержимым:

```javascript
(function($) {
  $(document).ready(function() {
    // При изменении значения поля категории
    $('#id_category').change(function() {
      var categoryId = $(this).val(); // Получаем выбранное значение категории
      var url = '/get_subcategories/' + categoryId + '/'; // URL-адрес для AJAX-запроса

      // Выполняем AJAX-запрос
      $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        success: function(data) {
          // Очищаем список подкатегорий
          $('#id_subcategory').empty();

          // Добавляем полученные подкатегории в список
          $.each(data, function(index, subcategory) {
            var option = $('<option>').val(subcategory.id).text(subcategory.name);
            $('#id_subcategory').append(option);
          });
        }
      });
    });
  });
})(django.jQuery);
```

2. Создайте URL-шаблон, который будет использоваться для получения подкатегорий по выбранной категории. Например, добавьте следующий URL-шаблон в файл `urls.py`:

```python
from django.urls import path
from . import views

urlpatterns = [
    # ...
    path('get_subcategories/<int:category_id>/', views.get_subcategories, name='get_subcategories'),
    # ...
]
```

3. Создайте представление `get_subcategories`, которое будет возвращать JSON-ответ с подкатегориями на основе выбранной категории. Например, в файле `views.py`:

```python
from django.http import JsonResponse
from .models import SubCategory

def get_subcategories(request, category_id):
    # Получаем подкатегории для выбранной категории
    subcategories = SubCategory.objects.filter(category_id=category_id).values('id', 'name')
    return JsonResponse(list(subcategories), safe=False)
```

4. В административной панели Django зарегистрируйте модель `Products` и задайте форму с поддержкой JavaScript. Например, в файле `admin.py`:

```python
from django.contrib import admin
from django.forms import ModelForm, widgets
from .models import Products

class ProductsForm(ModelForm):
    class Meta:
        model = Products
        exclude = []
        widgets = {
            'subcategory': widgets.Select(attrs={'class': 'subcategory-select'}),
        }

@admin.register(Products)
class ProductsAdmin(admin.ModelAdmin):
    form = ProductsForm

    class Media:
        js = ('subcategory_ajax.js',)
```

Теперь, при создании или редактировании продукта в админке Django, когда пользователь выбирает категорию в поле "category", в поле "subcategory" будут отображаться только подкатегории, относящиеся к выбранной категории.
Стандартными средствами нельзя легко сделать то, что вы хотите. Однако, вы можете попробовать сохранять изменения каждого поля отдельно и затем снова строить форму для обновленной модели. Если вы ищете более эффективное решение, можете написать индивидуальную страницу.
Похожие вопросы