将 url 参数发送到通用视图,该视图将其发送到 ModelForm 中的元素

Posted

技术标签:

【中文标题】将 url 参数发送到通用视图,该视图将其发送到 ModelForm 中的元素【英文标题】:Sending url parameter to generic view which sends it to an element in a 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”。

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

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

大局:

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

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

再次,向其他方式开放。

谢谢。

【问题讨论】:

【参考方案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 是的,这是我的疏忽,抱歉 =)

以上是关于将 url 参数发送到通用视图,该视图将其发送到 ModelForm 中的元素的主要内容,如果未能解决你的问题,请参考以下文章

在 Asynctask 中将视图作为参数发送

Django url 不接受参数

将一行从一个列表视图发送到另一个列表视图

如何将参数发送到嵌入式 Flutter Web 应用程序?

Sharekit - 将 url 链接发送到 facebook

如何使基于类的视图接受来自 URL 的参数或在 URLconf 中硬编码