如何使用 django-extra-views 将请求传递到内联表单集中

Posted

技术标签:

【中文标题】如何使用 django-extra-views 将请求传递到内联表单集中【英文标题】:How to pass a request into an inline form set using django-extra-views 【发布时间】:2012-11-27 18:15:03 【问题描述】:

我有一个带有内联表单集的表单。 我想做的是当用户登陆表单时,将他的用户信息(例如姓名)预填充到表单的内联之一中。为了能够将请求传递给内联。

我该怎么做?

我在 Django 1.4 上使用 django-extra-views 0.6

views.py 中,我使用get_extra_form_kwargs def 来设置我的kwargs,如下所示:

class EventMemberInline(InlineFormSet):
    model = EventMember
    extra = 1
    form_class = EventMemberForm

    def get_formset_kwargs(self):
        formset_kwargs = super(EventMemberInline, self).get_formset_kwargs()
        formset_kwargs.update('first_name':self.request.user.first_name, 'last_name':self.request.user.last_name)
        return formset_kwargs

我这样做是为了能够将我的内联字段(初始值)绑定到我通过 kwargs 传递的内容(在这种情况下只是用户名和姓氏)

forms.py

class EventMemberForm(ModelForm):

    class Meta:
        model = EventMember

    def __init__(self, *args, **kwargs):
        self.fields['first_name'].initial = kwargs['first_name']
        self.fields['last_name'].initial = kwargs['last_name']
        super(EventMemberForm, self).__init__(*args, **kwargs)

但我收到此错误:

Exception Value:    

__init__() got an unexpected keyword argument 'last_name'

我正在尝试做的事情是否可能?我可以设置内联的初始值吗?

【问题讨论】:

我为此github.com/AndrewIngram/django-extra-views/issues/35 创建了一个问题。我会尽快把它整理好。 谢谢!太好了@AndrewIngram 我会同时关注 django-extra-views ;) 刚刚意识到内联已经给出了请求。您应该能够在您的内联中覆盖 get_extra_form_kwargs 以将用户对象传递给每个表单实例。 @AndrewIngram 我更新了这个问题。如果你不介意偷看一眼。非常感谢。 0.6.0 中存在错误,请尝试 0.6.1。同样在你的例子中你有get_formset_kwargs而不是get_extra_form_kwargs,这是一个错字吗?您的表单也会损坏,我会将“正确”代码作为答案。 【参考方案1】:

django-extra-views==0.6.0 存在问题,这意味着 get_extra_form_kwargs 没有被调用用于内联,它应该在 0.6.1 中修复。

这应该可行:

class EventMemberInline(InlineFormSet):
    model = EventMember
    extra = 1
    form_class = EventMemberForm

    def get_extra_form_kwargs(self):
        kwargs = super(EventMemberInline, self).get_extra_form_kwargs()
        kwargs.update(
            'first_name': self.request.user.first_name,
            'last_name': self.request.user.last_name
        )
        return kwargs

...

class EventMemberForm(ModelForm):

    class Meta:
        model = EventMember

    def __init__(self, *args, **kwargs):
        initial_first_name = kwargs.pop('first_name')
        initial_last_name = kwargs.pop('last_name')

        super(EventMemberForm, self).__init__(*args, **kwargs)

        self.fields['first_name'].initial = initial_first_name
        self.fields['last_name'].initial = initial_last_name

【讨论】:

以上是关于如何使用 django-extra-views 将请求传递到内联表单集中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用静态库传输资源文件(如何将资源包装在包中)?

如何将 CameraX 与 PreviewView 一起使用?

如何将 groupBy 与 MagicalRecord 一起使用?

如何将 ASTextNode 与 TTTAttributedLabel 一起使用

我们如何将 OCP 与委托一起使用?

如何使用 AngularJS 将文件上传到 Google Drive