thatoneguy22
thatoneguy22

Reputation: 15

How to query a dropdown in a Django ModelForm field based on current logged in user

I have a django model form were a user can submit their budget information. One of the fields in the form is a Category which is a foreign key from a Category Model. Unfortunately all users can see each other category's. How can I query the Category Field in the model form to only show logged in user.

This is my 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'))

This is my 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'}),
        }

This is the view.py where I have attempted a query to filter for category of logged in users.

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

This is the view.py to add the Category.

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

Upvotes: 0

Views: 680

Answers (1)

Mukhtor Rasulov
Mukhtor Rasulov

Reputation: 587

You can do by passing user as default param and filter category in init like this:

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

Upvotes: 1

Related Questions