2011-03-25 43 views
1

中的Django模型實例,爲了使用不同的地圖專用窗體域(olwidget),我重寫了模型窗體域(location)。此MapField應包含一個圖層(InfoLayerField),該圖層顯示所有其他模型實例,但是此刻正在編輯該模型實例。現在,它顯示全部模型實例(請參閱MyModel.objects.all()),這意味着,如果編輯模型,當前位置顯示兩次。在我的一個管理窗體中訪問ModelForm的FormField定義

爲了做到這一點,我必須從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 

... 

感謝您的任何提示。

回答

4

我認爲你只需要重寫__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', 
       } 
      ) 
     ]) 
相關問題