python - 如何使用 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)
解决方案
修改您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)
推荐阅读
- ios - 具有系统字体、粗体和字距调整的 UIButton 子类
- swift - 快速通知未触发
- excel - 多次运行后重复宏出错
- google-chrome - Chrome 过滤掉 SameSite:None 安全 cookie
- xml - 将一列中的 XML 对象解析为多行,并允许在最后一行之后出现下一个 XML 对象
- javascript - 如何连接到数组状态的最后一项?
- javascript - 表单验证不适用于名称输入框
- datetime - 如何更改 showDatePicker 输入格式颤动
- php - 无法使用 Laravel API 接收来自 Postman 的 JSON 响应
- html - 单击 understrap 主题上的内容区域时显示不必要的边框