首页 > 解决方案 > 基于 URL 变量的 Django 模型表单小部件选择

问题描述

假设我有一个基于模型的表单:

Form1:
class Meta:
    model = Comment
        widgets = {"field1": forms.HiddenInput } # option 1
#or 
    widgets = {"field2": forms.HiddenInput } # option 2

我有 2 个小部件选项。第一个 - 显示第二个字段,但隐藏第一个和第二个 - 其他方式。选项 1 或选项 2 的选择取决于它将从 URL kwargs 接收到的“关键”变量。例如,如果 key == 1 则选择选项 1,如果 key == 2 – 则选择第二个选项。

#example

<a href="{%  url "app:route" key="1 or 2 " pk=object.pk %}"> COMMENT</a>

问题是如何在 .forms 中访问 self.kwargs 字典?还是有另一种不那么愚蠢的方法来做到这一点?最终目标是使用其中一个选项,以“key”变量为基础,即不同的 url 将发送不同的“key = x”变量。

我在哪里可以在 Django 中实现这种逻辑?意见?

标签: djangodjango-formsdjango-widget

解决方案


您需要向表单发送有关访问哪个 url 的信息,然后您可以使用此信息来选择要使用的小部件。

更改__init__您的表单:

#forms.py

class Form1(ModelForm):
    def __init__(self, key, *args, **kwargs):
        super(Form1, self).__init__(*args, **kwargs)
        if key == 1:
            self.fields['field1'].widget = forms.HiddenInput()  # option 1 HiddenInput() 
        else:
            self.fields['field2'].widget = forms.HiddenInput()  # option 2 HiddenInput() 

    class Meta:
        model = Comment

然后,在您看来,从请求的kwargs表单中添加密钥kwargs

# views.py

class MyFormView(FormView):
    form_class = Form1

    def get_form_kwargs(self):
        kwargs = super(MyFormView, self).get_form_kwargs()
        kwargs['key'] = self.kwargs.get('key')
        return kwargs

推荐阅读