我想知道这是不是正确的做法。我先调用queryset=Reward.objects.all()
来改变它并过滤它。但是,我无法想出更好的解决方案。你有什么想法吗?
class ClaimRewardForm(forms.ModelForm):
note = forms.CharField(widget=forms.Textarea)
title = forms.ModelChoiceField(queryset=Reward.objects.all())
# note = forms.DropDown()
class Meta:
model = Reward
fields = ['title']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['title'].queryset = Reward.objects.filter(event=self.initial['event'])
永远不会评估该查询集,因为您总是在实例化时替换它,所以放在那里并不重要。
一个替代的夜晚是使用Reward.objects.none()
来表明它从未使用过。
如果您应该处理一组模型,请尝试将您的方法更改为FormSets https://docs.djangoproject.com/en/2.0/topics/forms/formsets/
简而言之,FormSets方法似乎如此:1。为单个模型声明ClaimRewardForm类(在您的情况下为Reward
)2。声明ClaimRewardForm的ClaimRewardFormSet并覆盖
class BaseClaimRewardFormSet(BaseModelFormSet):
"""By default, when you create a formset from a model, the formset
will use a queryset that includes all objects in the model"""
def __init__(self, *args, **kwargs):
if 'event' in kwargs.keys():
event = kwargs.pop('event')
else:
event = None
super().__init__(*args, **kwargs)
if event is not None:
self.queryset = Reward.objects.filter(event=event)
else:
self.queryset = Reward.objects.none()
ClaimRewardFormSet = forms.modelformset_factory(Reward, RewardForm,
formset=BaseClaimRewardFormSet)