我的创建视图存在问题。我把它初始化为:
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中看到一条注释行,它是我试图这样做的地方。但它没有用。我怎样才能得到我需要的东西?
答案 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 方法中完成的。