【问题标题】:Sending url parameter to generic view which sends it to an element in a ModelForm将 url 参数发送到通用视图,该视图将其发送到 ModelForm 中的元素
【发布时间】:2014-04-07 14:45:09
【问题描述】:

我通过一个 url 向一个通用视图发送一个可选值,该视图使用这样的 Modelform:

class myClass(generic.CreateView):
   template_name = 'template.html'
   form_class = myForm
   ...

模型形式类似于:

class myForm(ModelForm):
    institution = CustomModelChoiceField(...)
    class Meta:
       model = myModel
       ...

我需要将下拉字段中的默认选择值设置为url中传递的值。

传递的值是模型的“id”。

  1. 如何将值传递给 myForm?
  2. myForm 如何将其设置为“选定”值?

我愿意接受其他方式来做到这一点。

大局:

我有一个 form1(模型 1),我在其中弹出另一个 form2(模型 2)(模型 1 的外键)。 form2 成功后,form1 下拉菜单设置为新的外键。

我曾考虑过通过 AJAX 来实现,但对于未来的功能,最好在 url 中传递值。

再次,向其他方式开放。

谢谢。

【问题讨论】:

    标签: django django-urls django-forms django-generic-views


    【解决方案1】:

    如果我理解正确,您可以重写 get_form_kwargs 方法以将 id 传递给表单构造函数(请参阅 this

    # views.py
    
    def get_form_kwargs(self):
        kwargs = super(CreateView, self).get_form_kwargs()
        kwargs.update({'id': self.kwargs.get('id')})
        return kwargs
    
    # forms.py
    
    def __init__(self, *args, **kwargs):
        id = kwargs.pop('id', None)
        super(Form, self).__init__(*args, **kwargs)
        self.fields['id'].initial = id 
    

    【讨论】:

    • 不起作用,我收到以下错误:__init__() got an unexpected keyword argument 'id'
    • 我知道出了什么问题,我编辑了你的答案,你可能还看不到。从本质上讲,kwargs 必须返回到它们的原始形式,因此:在调用 'init' 中的 'super' 之前需要 my_arg_val = kwargs.pop('id', None)。
    • @Ryan 是的,这是我的疏忽,抱歉 =)
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2012-02-13
    相关资源
    最近更新 更多