简体   繁体   English

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

[英]How to implement a dependent drop down list with Django CreateView?

I am trying to create a CreateView for one of my models "service". 我正在尝试为我的模型“服务”创建一个CreateView。 My "service" model has a foreign key to an "asset" model. 我的“服务”模型具有“资产”模型的外键。 "asset" model has a foreign key to the current user. “资产”模型对当前用户具有外键。

I would like to populate a drop down in "service" CreateView with all the "assets" owned by the current logged in "user". 我想用当前登录的“用户”拥有的所有“资产”填充“服务” CreateView的下拉列表。

Service model 服务模式

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)

Asset model 资产模型

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)

ServiceCreateView in views.py views.py中的ServiceCreateView

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

If I user 'asset' in fields, I get all the assets added to the drop-down list. 如果在字段中使用“资产”,则会将所有资产添加到下拉列表中。 I need it to be only the assets owned by the current user. 我只需要它是当前用户拥有的资产。

Any help in this much appreciated. 任何帮助在此表示赞赏。

Thank you. 谢谢。

(I am using the Django 2.2) (我正在使用Django 2.2)

Modify your ServiceCreateView to use distinct form, specify template and send current user to that form, so it will know for which user it will need to filter asset 修改您的ServiceCreateView以使用不同的表单,指定模板并将当前用户发送到该表单,这样它将知道需要筛选哪个用户的asset

views.py: 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

Create ModelForm with same fields and model, that will take user instance on init and filter your asset field accordingly. 使用相同的字段和模型创建ModelForm ,这将在初始化时获取user实例并相应地过滤您的asset字段。

forms.py: 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