Reputation: 15
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
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