【问题标题】:How display categories in forms only for user who created this?如何仅为创建此内容的用户在表单中显示类别?
【发布时间】:2022-11-09 21:18:33
【问题描述】:

我正在为控制交易(费用、收入、预算)创建应用程序。我希望每个用户都能够创建自己的支出类别和自己的开支。用户创建的所有费用和类别仅对该用户可见。

如果用户 A 创建类别“Food123”,则用户 B 看不到它。他可以创建自己的此类类别。

我创建了两个模型 - 类别和费用。

class Category(models.Model):
    name = models.CharField(max_length=100)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="category")

class Expense(models.Model):
    name = models.CharField(max_length=100)
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="expense")

在创建费用和类别时,我使用通用视图。

class ExpenseListView(LoginRequiredMixin, ListView):
model = Expense
context_object_name = 'expense'
template_name = 'expense/expense_list.html'

def get_queryset(self):
    return self.request.user.expense.all()

class ExpenseCreateView(CreateView):
    model = Expense
    success_url = '/record/expense'
    form_class = ExpenseForm

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.user = self.request.user
    self.object.save()
    return HttpResponseRedirect(self.get_success_url())

class CategoryCreateView(CreateView):
    model = Category
    success_url = '/record/expense'
    form_class = CategoryForm

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

更重要的是,我使用了 forms.py。

class ExpenseForm(forms.ModelForm):
    class Meta:
        model = Expense
        fields = ('name', 'amount', 'category')

class CategoryForm(forms.ModelForm):
    class Meta:
        model = Category
        fields = ('name',)

不幸的是,当用户 A 创建类别“IT”时,它会自动转到用户 B。当用户 B 创建他的费用时,他也会看到 A 创建的这个“IT”类别,而不是 B。

如何将表单中类别的显示限制为仅由特定用户创建的类别?

【问题讨论】:

    标签: python django database forms relation


    【解决方案1】:

    问题是因为您没有在ExpenseForm 中按用户过滤模型字段(就像您在ExpenseListView.get_queryset 中所做的那样)。

    要做到这一点,你需要改变一点你的逻辑。你尝试这样的事情:

    # forms.py
    class ExpenseForm(forms.ModelForm):
        def __init__(self, user, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # limit the category field queryset
            self.fields['category'] = forms.ModelChoiceField(
                queryset=user.category.all())
            )
        class Meta:
            model = Expense
            fields = ('name', 'amount', 'category')
    
    # views.py
    class ExpenseCreateView(CreateView):
        ...
        def get_form_kwargs(self):
            kwargs = super().get_form_kwargs()
            # inject the user in the form instantiation
            kwargs['user'] = self.request.user
            return kwargs
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多