Django 1.11将kwarg传递给modelform字段

时间:2018-04-12 00:45:03

标签: django django-forms django-views

我想通过一个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项目,所以我正在学习如何去,所以我假设我在某处发生了一些基本的错误!

2 个答案:

答案 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)

之前弹出munc