我正在尝试从 url kwarg <int:url_kwarg> 向 model-form/formset 字段添加一个动态查询集,目前还没有成功
I'm trying to add a dynamic queryset to a model-form/formset field from a url kwarg <int:url_kwarg>, no luck so far
编辑:看来我遇到的问题与 formset_factory()
调用直接相关。由于某种原因,如果我通过函数传递表单,我无法从视图访问 kwargs
。
我正在构建一个在数据结构中使用高度规范化的网络应用程序。有许多多对多和一对多关系可以防止过多的空记录和数据库膨胀。我想向模型添加更多条目,同时从 model.choice 字段中排除现有条目。
我的代码如下所示:
表格:
class ExtraAddForm(forms.ModelForm):
def __init__(self, url_kwarg, *args, **kwargs):
super(ExtraAddForm, self).__init__(self, *args, **kwargs)
list_to_exclude = []
query_target = models.Model.objects.get(fk_id=url_kwarg)
for object in query_target:
list_to_exclude.append(object.fk_id.id)
new_queryset = models.Model.objects.exclude(fk_id__in=list_to_exclude)
self.fields['fk_id'].queryset= new_queryset
class Meta:
model = models.Model
fields= ['fk_id','field_b'}
观点:
class AddOjbectsView(FormView):
formset = formset_factory(ExtraAddForm(url_kwarg), can_delete=True)
model = models.Model
url_kwarg = 'url_kwarg'
form_class = formset
template_name = 'some-template.html'
extra_context = {'some_object': models.Model2.objects.all,
'model_object': models.Model.objects.all,
'formset': formset,
'view_type_create': True
}
def __init__(self, *args, **kwargs):
kwargs['url_kwarg']= self.kwargs.get(self.url_kwarg)
super().__init__(self,*args,**kwargs)
def get(self, request, *args, **kwargs):
request.session['url_kwarg'] = self.kwargs.get(self.url_kwarg)
return super().get(self, request, *args, **kwargs)
def post(self, request, *args, **kwargs):
#this works so I'm not re-typing it
def get_context_data(self, **kwargs):
"""Insert the form into the context dict."""
if 'url_kwarg' not in kwargs:
kwargs['url_kwarg'] = self.kwargs.get(self.url_kwarg)
return super().get_context_data(**kwargs)
#this works, but only in the get_context. Its not working as a solution to my problem.
def get_success_url(self):
#this works, not re-typing
我的模板有 Javascript 来处理多个表单集,并且我已经使用非动态查询集对其进行了测试。我遇到的唯一问题是从 URL 中获取关键字参数并将其传递给 init.
处的表单
您尝试过使用FormView.get_form_kwargs
方法吗?
它在 docs
中有描述
class AddOjbectsView(FormView):
def get_form_kwargs(self):
form_kwargs = super().get_form_kwargs()
<b>form_kwargs['url_kwarg'] = self.kwargs['url_kwarg']</b>
return form_kwargs
我的问题的答案似乎是在 form validation
处弃用进程以支持会话变量,利用 clean data
函数。我上面的方法是由于对 django 操作顺序的无知而产生的,不应该再让任何人担心。
编辑:看来我遇到的问题与 formset_factory()
调用直接相关。由于某种原因,如果我通过函数传递表单,我无法从视图访问 kwargs
。
我正在构建一个在数据结构中使用高度规范化的网络应用程序。有许多多对多和一对多关系可以防止过多的空记录和数据库膨胀。我想向模型添加更多条目,同时从 model.choice 字段中排除现有条目。
我的代码如下所示: 表格:
class ExtraAddForm(forms.ModelForm):
def __init__(self, url_kwarg, *args, **kwargs):
super(ExtraAddForm, self).__init__(self, *args, **kwargs)
list_to_exclude = []
query_target = models.Model.objects.get(fk_id=url_kwarg)
for object in query_target:
list_to_exclude.append(object.fk_id.id)
new_queryset = models.Model.objects.exclude(fk_id__in=list_to_exclude)
self.fields['fk_id'].queryset= new_queryset
class Meta:
model = models.Model
fields= ['fk_id','field_b'}
观点:
class AddOjbectsView(FormView):
formset = formset_factory(ExtraAddForm(url_kwarg), can_delete=True)
model = models.Model
url_kwarg = 'url_kwarg'
form_class = formset
template_name = 'some-template.html'
extra_context = {'some_object': models.Model2.objects.all,
'model_object': models.Model.objects.all,
'formset': formset,
'view_type_create': True
}
def __init__(self, *args, **kwargs):
kwargs['url_kwarg']= self.kwargs.get(self.url_kwarg)
super().__init__(self,*args,**kwargs)
def get(self, request, *args, **kwargs):
request.session['url_kwarg'] = self.kwargs.get(self.url_kwarg)
return super().get(self, request, *args, **kwargs)
def post(self, request, *args, **kwargs):
#this works so I'm not re-typing it
def get_context_data(self, **kwargs):
"""Insert the form into the context dict."""
if 'url_kwarg' not in kwargs:
kwargs['url_kwarg'] = self.kwargs.get(self.url_kwarg)
return super().get_context_data(**kwargs)
#this works, but only in the get_context. Its not working as a solution to my problem.
def get_success_url(self):
#this works, not re-typing
我的模板有 Javascript 来处理多个表单集,并且我已经使用非动态查询集对其进行了测试。我遇到的唯一问题是从 URL 中获取关键字参数并将其传递给 init.
处的表单您尝试过使用FormView.get_form_kwargs
方法吗?
它在 docs
class AddOjbectsView(FormView):
def get_form_kwargs(self):
form_kwargs = super().get_form_kwargs()
<b>form_kwargs['url_kwarg'] = self.kwargs['url_kwarg']</b>
return form_kwargs
我的问题的答案似乎是在 form validation
处弃用进程以支持会话变量,利用 clean data
函数。我上面的方法是由于对 django 操作顺序的无知而产生的,不应该再让任何人担心。