django admin动态设置changeform的初始数据 [英] django admin dynamically set changeform initial data
问题描述
会员资格
与个人
和项目
模型。 到目前为止,我已经成功地在 Person
更改表单中显示默认的m2m小部件,并创建中间模型实例正确,但是当 Person
正在修改时,我的问题是填充小部件。
这是表单类我正在使用 PersonAdmin
:
class PersonForm form.ModelForm):
projects = forms.ModelMultipleChoiceField(models.Project.objects.all(),
widget = widgets.FilteredSelectMultiple(
verbose_name =Projects,
is_stacked = False,
attrs = {'rows':'10'}))
projects.required = False
class Meta:
model = models.Person
fields = ['name','last_name','personal_id_number',
'personal_id_type','administrative_viability',
'observations']
def save(self,commit = True):
ret = super(PersonForm,self).save(commit)
for self in self.cleaned_data ['projects']:
models .Membership.objects.create(person = self.instance,project = p)
return ret
和 PersonAdmin
本身:
class PersonAdmin(admin.ModelAdmin )
form = PersonForm
def get_changeform_initial_data(self,request):
initial = super(PersonAdmin,self).get_changeform_initial_data(request)
initial ['projects '] = models.Person.get(pk = initial ['person'])。project_set.all()
return initial
我尝试设置初始值项目
在方法 get_changeform_initial_data
中,但不起作用。总体而言,它看起来像被忽略,好像我没有正确地覆盖它。
任何帮助将不胜感激!
这个问题给了我覆盖我的 PersonForm
的 __ init __
方法的想法:
def __init __(self,* args,** kwargs):
if'instance'in kwargs:
person = kwargs ['instance']
initial = {'projects':person.project_set.all()}
kwargs ['initial'] = initial
super(PersonForm,self ).__ init __(* args,** kwargs)
我还不知道为什么要覆盖 get_changeform_initial_data
不起作用。
I'm implementing a m2m relationship through an intermediate model using the default m2m widget. I have the Person
and Project
models related using the Membership
model.
So far I've succeeded at displaying the default m2m widget in the Person
change form and creating the intermediate model instances correctly, but my problem is populating the widget when a Person
is being modified.
This is the form class I'm using with the PersonAdmin
:
class PersonForm(forms.ModelForm):
projects = forms.ModelMultipleChoiceField(models.Project.objects.all(),
widget=widgets.FilteredSelectMultiple(
verbose_name="Projects",
is_stacked=False,
attrs={'rows':'10'}))
projects.required = False
class Meta:
model = models.Person
fields = ['name', 'last_name', 'personal_id_number',
'personal_id_type', 'administrative_viability',
'observations']
def save(self, commit=True):
ret = super(PersonForm, self).save(commit)
for p in self.cleaned_data['projects']:
models.Membership.objects.create(person=self.instance, project=p)
return ret
And the PersonAdmin
itself:
class PersonAdmin(admin.ModelAdmin):
form = PersonForm
def get_changeform_initial_data(self, request):
initial = super(PersonAdmin, self).get_changeform_initial_data(request)
initial['projects'] = models.Person.get(pk=initial['person']).project_set.all()
return initial
I tried setting the initial value of projects
in the method get_changeform_initial_data
like that, but it doesn't work. Overall it looks like it's being ignored, as if I'm not overriding it properly.
Any help will be greatly appreciated!
This question gave me the idea of overriding the __init__
method of my PersonForm
:
def __init__(self, *args, **kwargs):
if 'instance' in kwargs:
person = kwargs['instance']
initial = {'projects': person.project_set.all()}
kwargs['initial'] = initial
super(PersonForm, self).__init__(*args, **kwargs)
I still don't know why overriding get_changeform_initial_data
wasn't working.
这篇关于django admin动态设置changeform的初始数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!