我正在从事简单的费用管理工作。每个用户都可以添加/删除/编辑操作,这代表费用或收入。但是我注意到了一个错误 - 在添加新操作时,可以选择其他用户帐户和类别。
这是我的操作模型:
class Operation(models.Model):
def get_category_color(self):
return Category.objects.get(name=self.category).color
types_tuples = ((-1, 'expense'), (1, 'earning'))
user = models.ForeignKey(User)
account = models.ForeignKey(Account)
category = models.ForeignKey(Category)
date = models.DateField()
amount = models.DecimalField(max_digits=10, decimal_places=2)
type = models.IntegerField(choices=types_tuples)
currency = models.CharField(max_length=3)
color = property(get_category_color)
OperationCreate视图:
class OperationCreate(CreateView, OperationMixIn):
model = Operation
form_class = OperationForm
success_url = reverse_lazy('manage_operations')
def form_valid(self, form):
operation = form.save(commit=False)
operation.currency = Account.objects.get(pk=form.instance.account_id).currency
self.update_account_balance(form)
form.instance.user = self.request.user
return super(OperationCreate, self).form_valid(form)
和OperationForm:
class OperationForm(ModelForm):
class Meta:
model = Operation
fields = ['account', 'type', 'category', 'date', 'amount']
问题是如何限制在发布新操作期间可用的帐户和类别的选择?我希望用户只能看到与他/她的帐户相关的内容。
我在“操作”模型中尝试limit_choices_to
作为models.ForeignKey(Account)
和models.ForeignKey(Category)
的参数,但无法以此方式工作。
我假设我需要使用一个只返回与当前用户相关的帐户和类别的查询。但是我不知道应该如何以及在哪里应用它。
你能指点我正确的方向吗?
编辑:
由于@efkin建议编辑了OperationForm:
class OperationForm(ModelForm):
class Meta:
model = Operation
fields = ['account', 'type', 'category', 'date', 'amount']
def __ini__(self, user, *args, **kwargs):
super(OperationForm, self).__init__(*args, **kwargs)
self.fields['account'] = ModelChoiceField(queryset=Account.objects.filter(user=user))
self.fields['category'] = ModelChoiceField(queryset=Category.objects.filter(user=user))
答案 0 :(得分:1)
您可以使用带有ModelChoiceField字段的简单表单作为外键。
答案 1 :(得分:0)
好的,所以我做了一些挖掘并想出了解决方案。必须使用ModelChoiceFiled修改OperationForm
(如@efkin所述),OperationCreate
应包含来自get_form_kwargs
的{{1}}方法的覆盖:
ModelFormMixIn