2014-11-06 3 views
3

Я реализую связь m2m через промежуточную модель, используя виджет m2m по умолчанию. У меня есть модели Person и Project, связанные с использованием модели Membership.django admin динамически задано изменение формы исходные данные

До сих пор мне удалось отобразить виджет по умолчанию m2m в форме изменения Person и правильно создать экземпляры промежуточной модели, но моя проблема заключается в заполнении виджета при изменении Person.

Это класс формы я использую с 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 

И сам 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 

Я попытался установить начальное значение projects в методе get_changeform_initial_data подобное , но это не сработает. В целом, похоже, что это игнорируется, как будто я не переопределяю его должным образом.

Любая помощь будет принята с благодарностью!

ответ

2

This question дал мне представление о том, перекрывая __init__ метод моей 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) 

Я до сих пор не знаю, почему наиважнейшая get_changeform_initial_data не работал.

Смежные вопросы