如何限制与数据库中另一个表相关的字段选择?

时间:2017-10-09 09:29:27

标签: django

我正在从事简单的费用管理工作。每个用户都可以添加/删除/编辑操作,这代表费用或收入。但是我注意到了一个错误 - 在添加新操作时,可以选择其他用户帐户和类别。

这是我的操作模型:

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))

2 个答案:

答案 0 :(得分:1)

您可以使用带有ModelChoiceField字段的简单表单作为外键。

答案 1 :(得分:0)

好的,所以我做了一些挖掘并想出了解决方案。必须使用ModelChoiceFiled修改OperationForm(如@efkin所述),OperationCreate应包含来自get_form_kwargs的{​​{1}}方法的覆盖:

ModelFormMixIn