Django:表单查询集

问题描述 投票:0回答:2

我想知道这是不是正确的做法。我先调用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'])
django
2个回答
1
投票

永远不会评估该查询集,因为您总是在实例化时替换它,所以放在那里并不重要。

一个替代的夜晚是使用Reward.objects.none()来表明它从未使用过。


0
投票

如果您应该处理一组模型,请尝试将您的方法更改为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) 
© www.soinside.com 2019 - 2024. All rights reserved.