Как запросить выпадающий список в поле 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')
Вернуться на верх