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