这样做的一个显而易见的方法是在ModelAdmin上使用formfield_for_foreignkey()方法。
所以,如果你的models.py如下:
from django.db import models
from django.contrib.auth.models import User
class City(models.Model):
name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class CityNews(models.Model):
added_by = models.ForeignKey(User)
city = models.ForeignKey(City)
title = models.CharField(max_length=100)
content = models.TextField()
class UserExtra(models.Model):
user = models.ForeignKey(User)
city = models.ForeignKey(City)
然后你admin.py看起来是这样的:
from django.contrib import admin
from formtesting.models import City, CityNews, UserExtra
from django.forms.models import ModelChoiceField
from django.contrib.auth.models import User
class CityAdmin(admin.ModelAdmin):
pass
admin.site.register(City, CityAdmin)
class CityNewsAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "city":
if request.user.is_superuser:
queryset = City.objects.all()
else:
queryset = City.objects.filter(userextra__user=request.user)
return ModelChoiceField(queryset, initial=request.user)
elif db_field.name == "added_by":
if request.user.is_superuser:
queryset = User.objects.all()
else:
queryset = User.objects.filter(id=request.user.id)
return ModelChoiceField(queryset, initial=request.user)
else:
return super(CityNewsAdmin, self).formfield_for_foreignkey(db_field,
request, **kwargs)
admin.site.register(CityNews, CityNewsAdmin)
class UserExtraAdmin(admin.ModelAdmin):
pass
admin.site.register(UserExtra, UserExtraAdmin)
有,你没有接受答案的理由?就是想。 – 2011-06-01 21:09:20
不,我忘了:) – robos85 2011-06-02 21:15:13