0

我有两个下拉列表:

  1. 类别
  2. 子类别

两者都需要动态填充

在这里,我想根据类别字段中的选定值填充 sub_category 中的选项。所以我不需要保存整个表格。

class AddProductForm(forms.Form):
    category = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control'}),
    queryset=Category.objects.all(), to_field_name="category")
    sub_category = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control'}))
4

1 回答 1

0

django_select2 示例 models.py

from django.db import models


class Category(models.Model):
    name_category = models.CharField(verbose_name='Category title', max_length=100, null=True)
    slug = models.SlugField(max_length=160, unique=True, null=True)

    class Meta:
        ordering = ('name_category',)

    def __str__(self):
        return self.name_category


class Subcategory(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='Category', related_name='sub')
    name_subcategory = models.CharField(verbose_name='Subcategory title', max_length=100, null=True)
    slug = models.SlugField(max_length=160, unique=True, null=True)

    class Meta:
        ordering = ('category', 'name_subcategory',)

    def __str__(self):
        return self.name_subcategory


class Product(models.Model):
    subcategory = models.ForeignKey(Subcategory, on_delete=models.CASCADE, verbose_name='Category', related_name='prod')
    name_product = models.CharField(verbose_name='Product title', max_length=100, null=True)
    price = models.IntegerField(verbose_name='Price')

    class Meta:
        ordering = ('name_product', )

    def __str__(self):
        return self.name_product

forms.py(我使用了 'style': 'width:350px;' 因为我在这个测试项目中没有任何 CSS)

from django import forms
from django_select2.forms import ModelSelect2Widget
from .models import Category, Subcategory


class AddProductForm(forms.Form):
    category = forms.ModelChoiceField(
        queryset=Category.objects.all(),
        widget=ModelSelect2Widget(
            search_fields=['name_category__icontains'],
            attrs={'style': 'width:350px;', },
        )
    )
    sub_category = forms.ModelChoiceField(
        widget=ModelSelect2Widget(
            attrs={'style': 'width:350px;', },
            model=Subcategory,
            search_fields=['name_subcategory__icontains'],
            dependent_fields={'category': 'category'},

        ),
        queryset=Subcategory.objects.all(),
    )

views.py

from .forms import AddProductForm


class AddProductView(FormView):
    form_class = AddProductForm
    template_name = "categories/new_product.html"

new_product.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="PATH_TO_JQUERY"></script>
    {{ form.media }}
</head>
<body style="background-color: white;">
    <form>
    <table>
    {{ form.as_table }}
    </table>
    </form>
</body>
</html>

您还需要将 您的,放入path('select2/', include('django_select2.urls')),您的 其他要提及的事情中,依赖字段仅在一个表单中有效,并且标签是强制性的urls.py'django_select2'INSTALLED_APPSsettings.pyform

于 2020-07-05T22:11:32.503 回答