首页 > 解决方案 > 如何使用 Django CreateView 实现依赖下拉列表?

问题描述

我正在尝试为我的一个模型“服务”创建一个 CreateView。我的“服务”模型有一个“资产”模型的外键。“资产”模型对当前用户有一个外键。

我想用当前登录的“用户”拥有的所有“资产”填充“服务”CreateView 中的下拉列表。

服务模式

class Service(models.Model):
    name = models.CharField(max_length=100)
    category = models.CharField(max_length=100)
    provider = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    asset = models.ForeignKey(Asset, on_delete=models.CASCADE)

资产模型

class Asset(models.Model):
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)
    suburb = models.CharField(max_length=100)
    postcode = models.CharField(max_length=4)
    state = models.CharField(max_length=3)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

view.py 中的 ServiceCreateView

class ServiceCreateView(LoginRequiredMixin, CreateView):
    model = Service
    fields = ['name', 'category', 'provider', 'asset']

如果我在字段中使用“资产”,我会将所有资产添加到下拉列表中。我需要它只是当前用户拥有的资产。

非常感谢任何帮助。

谢谢你。

(我使用的是 Django 2.2)

标签: pythondjango

解决方案


修改您ServiceCreateView以使用不同的表单,指定模板并将当前用户发送到该表单,以便它知道需要过滤哪个用户asset

视图.py:

class ServiceCreateView(LoginRequiredMixin, CreateView):
    form_class = ServiceCreateForm
    template_name = 'service_form.html'

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

使用相同的字段和模型创建ModelForm,它将user在 init 上执行实例并asset相应地过滤您的字段。

表格.py:

class ServiceCreateForm(forms.ModelForm):
    class Meta:
        model = Service
        fields = ['name', 'category', 'provider', 'asset']

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)

        self.fields['asset'].queryset = self.fields['asset'].queryset.filter(
            owner=user)

推荐阅读