Как запросить выпадающий список в поле Django ModelForm на основе текущего вошедшего пользователя
У меня есть форма модели django, в которой пользователь может представить информацию о своем бюджете. Одним из полей формы является Category, которая является внешним ключом от модели Category. К сожалению, все пользователи могут видеть категории друг друга. Как я могу запросить поле Category в модели формы, чтобы оно показывало только зарегистрированного пользователя.
Это мой Model.py
from django.contrib.auth.models import User
class Category(models.Model):
    user = models.ForeignKey(User,on_delete=models.SET_NULL,null=True,blank =True)
    TYPE = (
            ('Income', 'Income'),
            ('Expense', 'Expense'),)
    category_feild =  models.CharField(max_length = 100,unique = True)
    income_or_expense = models.CharField(default =" ",max_length=200, choices=TYPE)
    def __str__(self):
        return self.category_feild
class Budget(models.Model):
    
    category = models.ForeignKey(Category,on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now_add=False)
    budget_amt = models.FloatField(default= 0)
    comments = models.CharField(max_length = 140,default="")
    def __str__(self):
        return self.category.category_feild +' - ' + str(self.date.strftime('%b %Y'))
Это мой forms.py
class budget_form(ModelForm):
    class Meta:
        model = Budget
        fields = ['category','date','budget_amt','comments' ]
    
        widgets = {
            
            'category' : forms.Select(attrs={'class':'form-control'}),
            'date' : forms.DateInput(attrs={'class':'form-control'}),
            'budget_amt' : forms.NumberInput(attrs={'class':'form-control'}),
            'comments' : forms.TextInput(attrs={'class':'form-control'}),
        }
Вот view.py, в котором я попытался выполнить запрос для фильтрации категории зарегистрированных пользователей.
def add_budget(request):
    b_form = budget_form
    if request.method == 'POST' and "budgetForminfo" in request.POST:
        budget_form.fields["category"].queryset= Category.objects.filter(user=request.user)
        b_form = budget_form(request.POST or None)
        
        if b_form.is_valid():
            
            b_form.save()
            b_form = budget_form()
            return redirect('add_budget')
Это view.py для добавления Категории.
def add_category(request):
    form = categories_form
    if request.method == 'POST':
        form = categories_form(request.POST)
        if form.is_valid():
            form.save(commit= False)
            form.instance.user = request.user
            form.save()
            return redirect('add_budget')
                
Вы можете сделать это, передав пользователя как параметр по умолчанию и категорию фильтра в init вот так:
#form class
class BudgetForm(ModelForm):
    def __init__(self,*args, user=None, **kwargs):
        super(BudgetForm, self).__init__(*args, **kwargs)
        if user is not None:
            self.fields['category'].queryset = Category.objects.filter(user=user)
    class Meta:
        model = Budget
        fields = ['category','date','budget_amt','comments' ]
        widgets = {
            'category' : forms.Select(attrs={'class':'form-control'}),
            'date' : forms.DateInput(attrs={'class':'form-control'}),
            'budget_amt' : forms.NumberInput(attrs={'class':'form-control'}),
            'comments' : forms.TextInput(attrs={'class':'form-control'}),
        }
#view
def add_budget(request):
    b_form = BudgetForm(user=request.user)
    if request.method == 'POST' and "budgetForminfo" in request.POST:
        b_form = BudgetForm
        if b_form.is_valid():
            b_form = budget_form(request.POST or None,request.FILES, user=request.user)
            b_form.save()
            b_form = budget_form()
            return redirect('add_budget')