django admin动态设置changeform的初始数据 [英] django admin dynamically set changeform initial data

查看:1236
本文介绍了django admin动态设置changeform的初始数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用默认的m2m小部件通过中间模型实现m2m关系。我使用会员资格个人项目模型。



到目前为止,我已经成功地在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆