Django:如何为modelformset_factory定义__init__方法过滤产品
解决ModelFormSet中按当前用户过滤产品字段的问题
要在ModelFormSet中实现按当前登录用户过滤产品选项,你需要先自定义ModelForm并添加过滤逻辑,再将其关联到表单集,最后在视图中传递用户参数。具体步骤如下:
1. 自定义ModelForm并添加过滤逻辑
先创建一个继承自ModelForm的自定义表单类,在__init__方法中接收用户参数,以此过滤product字段的查询集:
from django import forms from .models import Author, Products class AuthorForm(forms.ModelForm): class Meta: model = Author fields = ('name', 'age', 'gender', 'product') widgets={ 'name': forms.TextInput(attrs={ 'class': 'form-control', 'placeholder': 'Enter Author Name here' }), 'age': forms.TextInput(attrs={ 'class': 'form-control', 'placeholder': 'Enter Author age' }), 'gender': forms.TextInput(attrs={ 'class': 'form-control', 'placeholder': 'Enter Author Gender' }) } def __init__(self, *args, **kwargs): # 从参数中取出当前用户,默认值为None self.user = kwargs.pop('user', None) super().__init__(*args, **kwargs) # 若用户存在,过滤产品选项仅显示该用户的产品 if self.user: self.fields['product'].queryset = Products.objects.filter(user=self.user)
2. 基于自定义表单创建ModelFormSet
使用modelformset_factory时,指定form参数为上面的自定义表单类:
from django.forms import modelformset_factory AuthorFormset = modelformset_factory( Author, form=AuthorForm, # 关联自定义表单 extra=1, )
3. 在视图中传递用户参数给表单集
在视图实例化表单集时,通过form_kwargs将当前登录用户传递给每个表单:
from django.shortcuts import render from .forms import AuthorFormset def author_formset_view(request): if request.method == 'POST': formset = AuthorFormset(request.POST, form_kwargs={'user': request.user}) if formset.is_valid(): formset.save() # 这里添加表单提交成功后的逻辑(如跳转页面) else: formset = AuthorFormset(form_kwargs={'user': request.user}) return render(request, 'your_template.html', {'formset': formset})
这样表单集中的每个product字段都会只显示当前登录用户名下的产品选项。
内容的提问来源于stack exchange,提问作者Destiny Franks
相关产品推荐
相关产品推荐

