python - Django 表单下拉字段显示其他用户拥有的数据
问题描述
我无法从 CreateView 和 Form 中仅查询用户拥有的项目:
# views.py
class ExpenseCreateView(LoginRequiredMixin, CreateView):
model = Expense
form_class = ExpenseCreateForm
template_name = "expenses/expense_form.html"
success_url = reverse_lazy("expense-list")
def form_valid(self, form):
form.instance.owner = self.request.user
return super(ExpenseCreateView, self).form_valid(form)
# forms.py
class ExpenseCreateForm(forms.ModelForm):
class Meta:
model = Expense
exclude = ("owner", )
widgets = {"date": DateInput(), "time": TimeInput()}
# models.py
class Expense(models.Model):
date = models.DateField(db_index=True)
time = models.TimeField(null=True, blank=True)
amount = models.DecimalField(max_digits=10, decimal_places=2, help_text="Amount of € spent.")
location = models.ForeignKey("Location", on_delete=models.SET_NULL, null=True)
document = models.FileField(
upload_to=UploadToPathAndRename("documents/"), blank=True, null=True
)
image = models.ImageField(
upload_to=UploadToPathAndRename("images/"), blank=True, null=True
)
payment = models.ForeignKey("Payment", on_delete=models.SET_NULL, db_index=True, null=True)
comment = models.TextField(null=True, blank=True, help_text="Additional notes...")
owner = models.ForeignKey(User, on_delete=models.CASCADE)
class Payment(models.Model):
title = models.CharField(max_length=100)
comment = models.TextField(blank=True, null=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
该表单有效,但每个用户都可以看到其他用户的位置和付款。哪个是添加验证/检查以仅返回由用户发出请求所拥有的位置的正确位置和方法?
解决方案
我通常将用户作为参数传递给表单以设置查询集以限制选择。
class ExpenseCreateView(LoginRequiredMixin, CreateView):
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["user"] = self.request.user
return kwargs
class ExpenseCreateForm(forms.ModelForm):
def __init__(self, *args, user, **kwargs):
super().__init__(self, *args, **kwargs)
self.fields['location'].queryset = user.location_set.all()
self.fields['payment'].queryset = user.payment_set.all()
推荐阅读
- firebase - 执行事务时出错,事务中读取的每个文档也必须写入。,null
- android - 如何从firebase(datasnapshot)获取数据?
- ios - 使用通用 URL 反应原生 ios 深度链接
- javascript - 一个 href"#" 数据切换锚点到顶部
- go - 需要一个例子来说明赋值运算符的 Go 语法如何使用使用 EBNF 指定的语法规则
- java - 无法运行颤振医生--android-licenses
- intellij-idea - 我可以在不运行程序的情况下在 IntellIJ 中显示环境变量吗?
- c - 在 C 中加载不正确
- spring - 带有 Eclipselink 保存操作的 Spring JPA 不会持续存在
- metal - sample() 是否总是在 Metal Shading Language 中以 RGBA 格式返回 float4?