2012-05-28 98 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

相關問題