【问题标题】:Django model-forms widget choice based on URL variables基于 URL 变量的 Django 模型表单小部件选择
【发布时间】:2019-04-17 14:23:07
【问题描述】:

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

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 中实现这种逻辑?观看次数?

【问题讨论】:

    标签: django django-forms django-widget


    【解决方案1】:

    您需要向表单发送有关访问哪个 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
    

    【讨论】:

    • "Aman Garg。谢谢。它有帮助。我只是无法理解它,但它最终很容易......
    • 再次感谢。您能否建议如何将“pk”从基于函数的视图传递到表单的 init???
    • 只需在更新表单的 init 方法以获取该参数后将表单初始化为 Form1(pk=pk)(就像我们在表单中添加了 key 一样)
    猜你喜欢
    • 2013-01-07
    • 2012-06-10
    • 1970-01-01
    • 2011-03-12
    • 2018-04-15
    • 2018-12-18
    • 1970-01-01
    • 2017-03-06
    • 2013-01-14
    相关资源
    最近更新 更多