如何使用Django CreateView实现从属下拉列表?

时间:2019-04-26 01:50:09

标签: python django

我正在尝试为我的一个模型“服务”创建一个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)

1 个答案:

答案 0 :(得分:1)

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

views.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实例,并相应地过滤asset字段。

forms.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)