如何使用 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 一起使用?