Доступ к экземпляру модели Django в определениях FormField ModelForm - PullRequest
1 голос
/ 25 марта 2011

в одной из моих форм администратора я переопределяю поле формы модели (location), чтобы использовать другое поле формы, специфичное для карты (olwidget). Этот MapField должен включать слой (InfoLayerField), который отображает все другие экземпляры модели, кроме того, который редактируется в данный момент. Прямо сейчас отображается все экземпляров модели (см. MyModel.objects.all()), что означает, что при редактировании модели текущее местоположение отображается дважды.

Чтобы достичь этого, я должен исключить текущий отредактированный экземпляр модели из QuerySet, используемого в InfoLayerField (что-то вроде MyModel.objects.exclude(pk=self.instance.pk)). Но так как поля формы определены как статические переменные, я не могу получить доступ к self.instance.

Есть ли способ достичь этого?

# models.py
class MyModel(models.Model):
    name = models.CharField(max_length=200)
    location = models.PointField(blank=True, null=True)


# admin.py
from olwidget.fields import MapField, EditableLayerField, InfoLayerField
from olwidget.utils import get_ewkt

class MyModelAdminForm(forms.ModelForm):
    class Meta:
        model = MyModel

    location = MapField([
        EditableLayerField({
            'geometry': 'point',
            'name': 'location',
        }),
        InfoLayerField(
            [(get_ewkt(m.location), m.name) for m in MyModel.objects.all() if m.location ], {
                'geometry': 'point',
                'name': 'other locations',
                'cluster': True,
                'cluster_display': 'list',
            }
        )
    ])

class MyModelOlwidgetAdmin(admin.ModelAdmin, GeoModelAdmin):
    form = MyModelAdminForm

...

Спасибо за любую подсказку.

1 Ответ

4 голосов
/ 25 марта 2011

Я думаю, вам просто нужно переопределить __init__ в вашей форме:

class MyModelAdminForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self,*args,**kwargs):
        super(MyModelAdminForm, self).__init__(*args,**kwargs)
        qs = MyModel.objects.exclude(pk = self.instance.pk) #grab instance.pk here
        self.fields['location'] = MapField([
            EditableLayerField({
                'geometry': 'point',
                'name': 'location',
            }),
            InfoLayerField(
                [(get_ewkt(m.location), m.name) for m in qs if m.location ], {
                    'geometry': 'point',
                    'name': 'other locations',
                    'cluster': True,
                    'cluster_display': 'list',
                }
            )
        ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...