繁体   English   中英

如何使用Django CreateView实现依赖下拉列表?

[英]How to implement a dependent drop down list with 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)

views.py中的ServiceCreateView

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

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

任何帮助在此表示赞赏。

谢谢。

(我正在使用Django 2.2)

修改您的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM