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