蟒蛇。 Django的。在CreateView中更改get_context_data中的表单提要

时间:2017-02-23 18:57:36

标签: python django forms class

我的创建视图存在问题。我把它初始化为:

class OutputCreateView(LoginRequiredMixin, generic.CreateView):
    template_name = 'rcapp/common_create_update.html'
    form_class = OutputForm
    model = Output
    def get_context_data(self, **kwargs):
        context = super(OutputCreateView, self).get_context_data(**kwargs)
        # self.form_class.fields['activity_ref'].queryset = Activity.objects.filter(rc_ref=ResultsChain.objects.get(pk=self.kwargs['rc']).pk)
        context['is_authenticated'] = self.request.user.is_authenticated
        return context
    def form_valid(self, form):
        # code code code
        return redirect("/portal/edit/" + str(self.kwargs['rc']) + "/#outputs-table")

我的模型中有一个ForeignKey字段,我想过滤当前视图的选项。

我的表单设置如下:

class OutputForm(forms.ModelForm):
    class Meta:
        model = Output
        fields = ['value', 'activity_ref']
        widgets = {
            'value': forms.Select(choices=(#Choises here 
            ,), attrs={"onChange":'select_changed()', 'class':'selector'})
        }

我需要更改activity_ref字段的查询集。 你可以在get_context_data中看到一条注释行,它是我试图这样做的地方。但它没有用。我怎样才能得到我需要的东西?

1 个答案:

答案 0 :(得分:1)

您需要将选项/查询集传递给表单。

在OutputCreateView

def get_form_kwargs(self, *args, **kwargs)
    filter_key = self.kwargs['rc']).pk
    return {'filter_key': key}

像这样,由于意外的参数,它会在创建表单时出错。要解决这个问题并使用它,请覆盖 init 方法。

在你的OutputForm

def __init__(self, *args, **kwargs)
    kwargs.pop('filter_key')
    super()._init__(*args, **kwargs)
    self.fields['value'] = forms.Select(queryset=Activity.objects.filter(rc_ref=ResultsChain.objects.get(pk=self.kwargs['rc']).pk), 
                                        attrs={"onChange":'select_changed()', 'class':'selector'})

您不需要设置小部件值,因为它是在 init 方法中完成的。