問題:
我如何能提供不同的用戶對在管理同ManyToManyField選擇不同的子集,並有每個用戶的選擇隻影響他們的選擇?Django的:我怎樣才能提供不同的用戶選擇不同的子集相同ManyToManyField
方案:
我正在構建交互式地圖網絡應用程序。可以有許多地圖。可以有很多MapItems。 MapItems可以在很多地圖上,地圖可以有很多地圖項目。因此一個ManyToMany關係。
每個地圖都有一個所有者,我只想要一個地圖的所有者能夠從他/她的地圖添加或刪除MapItems。
這裏是我的模型的相關部分:
class Map(models.Model):
# Omit
owner = models.ForeignKey(User, default=1)
class MapItem(models.Model):
# Omit
map = models.ManyToManyField(Map, default=None, blank=True)
MapItem.map由MapItem管理界面上<select>
表示:
<select multiple="multiple" id="id_map" name="map">
<option value="1">Bob's Map</option>
<option value="2">Sally's Map</option>
</select>
我想鮑勃只可以選擇選擇/取消選擇Bob的地圖,甚至不會看到Sally的地圖作爲選項。
我已經能夠通過重寫ModelAdmin上的get_form()來過濾admin <select>
窗口小部件中顯示的選項。
def get_form(self, request, obj=None, **kwargs):
kwargs['form'] = MapItemAdminForm
form = super(MapItemAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['map'].queryset = form.base_fields['map'].queryset.filter(Q(owner=request.user) | Q(groups__in=request.user.groups.all()))
return form
到目前爲止好。這給了我一個選擇只有所需的選項:
<select multiple="multiple" id="id_map" name="map">
<option value="1">Bob's Map</option>
</select>
問題出現在鮑勃保存時。當Bob保存時,它會清除Sally地圖的任何保存值。所以如果Sally的地圖被選中,當鮑勃保存時(儘管鮑勃看不見),莎莉的地圖被取消選擇。
有沒有更好的方法來解決這個問題?有沒有辦法確保保存不變的值(如選擇Sally的地圖)?
您需要驗證輸入數據,如果試圖挽救無效值給出一個錯誤。 –