根据请求更改表单字段

Pho*_*beB 3 django django-forms

该应用程序具有可在会话中设置的类别字段,但可能不是.如果是,我不希望看到表单上的字段只是将其作为隐藏字段,其值等于请求中的值.如果没有设置,那么我想显示一个下拉列表.

我已经设置了表单以包含下拉列表,这是此字段的默认值,我的问题是,将窗口小部件更改为隐藏的最佳位置在哪里,请记住我需要请求所以我无法在表单init,这是显而易见的地方.

试过这种方法,但这个领域仍然可见:

class DocForm(forms.ModelForm):


    class Meta:
        model = Document
        fields = __all__
        widgets = {"creator": forms.HiddenInput(),}

    def __init__(self, *args, **kwargs):
        #cant do it here because don't have request

class DocAddView(CreateView):


    form_class = DocForm


    def get_form_class(self):
        form_class = super(DocAddView, self).get_form_class()
        form_class.Meta.widgets['category'] = forms.HiddenInput()
        return form_class
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 5

更改表单的__init__方法以获取请求对象.

class DocForm(forms.ModelForm):
    ...
    def __init__(self, request, *args, **kwargs):
        super(DocForm, self).__init__(*args, **kwargs)
        use_hidden_input = do_something_with_request(request)
        if use_hidden_input:
            self.fields['category'].widget = forms.HiddenInput()
Run Code Online (Sandbox Code Playgroud)

然后覆盖get_form_kwargs,以便视图将请求传递给表单.

class DocAddView(CreateView):
    ...
    def get_form_kwargs(self):
        # grab the current set of form #kwargs
        kwargs = super(DocAddView, self).get_form_kwargs()
        # Update the kwargs with the user_id
        kwargs['request'] = self.request
        return kwargs
Run Code Online (Sandbox Code Playgroud)

这篇博文中解释了这种方法.