繁体   English   中英

如何根据当前登录用户查询 Django ModelForm 字段中的下拉列表

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

我有一个 django model 表格,用户可以提交他们的预算信息。 表单中的一个字段是类别,它是类别 Model 的外键。 不幸的是,所有用户都可以看到彼此的类别。 如何查询 model 表单中的类别字段以仅显示登录用户。

这是我的 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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM