2012-05-28 99 views
0
class Facilites(models.Model): 
    id = models.CharField(max_length=32, primary_key=True) 
    name = models.CharField(max_length=128) 

class Objects(models.Model): 
    name = models.CharField(max_length=64) 
    facilityid = models.ForeignKey(Facilities) 

class Admins(models.Model): 
    user = models.OneToOneField(User) 
    facilities = models.ManyToManyField(Facilities) 

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Admins.objects.create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

我想要的是让用户(管理员)只能将对象中的“facilityid”添加或修改为其Admins.facilities中指定的值。 因此,如果某个用户名为UserA并且设施=('FacA','FacB'),那么当他向DB添加新对象时,他无法添加Object('Random object',' FacC')django admin在某些字段中添加固定值的数据

另外,他不应该能够修改现有对象到他不属于的设施。

我已筛选的对象有:

def queryset(self, request): 
    qs = super(ObjectsAdmin, self).queryset(request) 
    if request.user.is_superuser: 
     return qs 
    return qs.filter(facitityid__id__in = request.user.get_profile().facilities.all()) 

,因此用户只能看到属于他们的设备的对象。但我不知道如何防止他们从他们的设施中添加/编辑对象。

编辑:

在这里找到了答案:https://stackoverflow.com/a/3048563/1421572

事实证明,ModelAdmin.formfield_for_foreignkey在这种情况下,正确的答案:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

回答

2

我会无论是预先制作这样做设施列表(即您可以创建一个整数字段,挂钩FACILITY_CHOICES供用户选择。)

如果只有管理员可以这样做,那么权限听起来相当可行的。您也可以执行表单验证来检查针对数据库的错误。取决于你有多少设施可能需要不同的方法。

你也可以用models.CharField做同样的技巧。因此,也许为每个设施分配一个3字母设施代码,并要求条目匹配3个字母字符串中的一个。你甚至可以在.txt文件中读取列表。有这么多的方法可以做到这一点。我公司将提供预先制作设施清单的例子和​​访问设备的特定用户从API /模板属于:

NYC_FACILITY = 0 
LA_FACILITY = 1 
ATL_FACILITY = 2 

FACILITY_CHOICES = (
    (NYC_FACILITY, 'NYC'), 
    (LA_FACILITY, 'LA'), 
    (ATL_FACILITY, 'ATL'), 

class Facility(models.Model): 
    name = models.IntegerField(choices=FACILITY_CHOICES, default="NYC") 

    class Meta: 
     order_by = ['name'] 
     verbose_name_plural = "facilities" 
     verbose_name = "facility" 
    def __unicode__(self): 
     return self.name 

至于观看特定用户属于你将拥有设施页一对一或两对象之间的FK关系。如果FK或m2m关系,那么您将有权访问该模型类型的其他方法。 get_related然而,我不会在我的例子中使用get_related。一旦你在一个实例中,你就可以访问entry_set。

# models.py 
from django.auth import User 
class Person(User): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    facility_loc = models.ForeignKey('Facility') # ForeignKey used assuming only one person can belong to a facility. 
    slug = models.SlugField(unique=True) 

def get_absolute_url(self): 
    return "/%s/%s/" % self.facility_loc % self.slug 

# views.py - TemplateView is automatically given a context variable called params which parses data from the URL. So, I'll leave the regex in the URLConf up to you. 

class UserFacilityView(TemplateView): 
    model = Facility 
    template_name = "user_facility.html" 

现在在您的模板中,您应该能够从设施实例的User实例或user_set访问facility_set。

+0

设施清单在设施表中的分贝。每个管理员应该能够属于任何和所有设施,但是只能编辑和添加属于他的设施的对象。 每个对象只属于一个设施。 我想在django管理界面。 – marvin

相关问题