Django:表单查询集



我想知道这是否是正确的方法。我第一次调用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。为单个模型(在您的案例中为Reward(2声明ClaimRewardForm类。使用重写为ClaimRewardForm声明ClaimReward FormSet

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) 

最新更新