我想通过一个kwarg设置一个模型形式字段,但我正在努力弄清楚如何去做。
我的网址如下:
url(r'^tent/create/(?P<munc>\d+)',views.TentCreate.as_view(),name='tent_create'),
我的观点很简单:
class TentCreate(CreateView):
model = Tent
form_class = TentForm
我的表格:
class TentForm(ModelForm):
class Meta:
model = Tent
exclude =('asfo','niho')
def __init__(self, *args, **kwargs):
super(TentForm, self).__init__(*args, **kwargs)
self.fields['primary'].queryset = Mark.objects.filter(munc=self.kwargs['munc'])
来自模特:
class Tent(models.Model):
primary = models.ForeignKey(Mark,on_delete=models.CASCADE)
我可以在不覆盖def __init
的情况下渲染表单,而不对“主要”字段应用过滤。
但是,尝试使用我上面描述的def __init
代码将munc
kwarg传递给表单字段会导致以下错误:
“'TentForm'对象没有属性'kwargs'”
我一直在试图解决这个问题,所以如果有人能够提供一些指导来解决这个问题我真的很感激。这是我的第一个Django项目,所以我正在学习如何去,所以我假设我在某处发生了一些基本的错误!
答案 0 :(得分:2)
尝试覆盖get_form_kwargs
方法:
<强> views.py 强>
class TentCreate(CreateView):
model = Tent
form_class = TentForm
def get_form_kwargs(self):
kwargs = super(TentCreate, self).get_form_kwargs()
kwargs.update({'munc': self.kwargs['munc']})
return kwargs
<强> forms.py 强>
class TentForm(ModelForm):
class Meta:
model = Tent
exclude =('asfo','niho')
def __init__(self, *args, **kwargs):
munc = kwargs.pop('munc')
super(TentForm, self).__init__(*args, **kwargs)
self.fields['primary'].queryset = Mark.objects.filter(munc=munc)
答案 1 :(得分:0)
class TentCreate(CreateView):
form_class = TentForm
def get_form(self, form_class=None):
if form_class is None:
form_class = self.get_form_class()
kwargs = self.get_form_kwargs()
print(kwargs, self.kwargs)
kwargs.update(self.kwargs)
return form_class(**kwargs)
forms.py
class TentForm(ModelForm):
class Meta:
model = Tent
exclude =('asfo','niho')
def __init__(self, *args, **kwargs):
munc=self.kwargs['munc']
super(TentForm, self).__init__(*args, **kwargs)
self.fields['primary'].queryset = Mark.objects.filter(munc=munc)
你必须在致电super(TentForm, self).__init__(*args, **kwargs)