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' のようなものを追加することはできません。 ')

また、既存のオブジェクトを自分が属していない施設に変更することはできません。

オブジェクトを次のようにフィルタリングしました。

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

4

1 に答える 1

2

これは、事前に作成された施設リストを使用して行います (つまり、ユーザーが選択できるように、FACILITY_CHOICES にフックされる整数フィールドを作成できます)。

管理者だけがそれを実行できるのであれば、パーミッションは非常に実行可能に思えます。フォーム検証を実行して、データベースに対してエラーをチェックすることもできます。施設の数によっては、異なるアプローチが必要になる場合があります。

models.CharField でもこれと同じ手法を実行できます。そのため、各施設に 3 文字の施設コードを割り当て、エントリが 3 文字の文字列の 1 つと一致するように要求します。リストを .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

特定のユーザーが属する施設ページを表示する限り、オブジェクト間に m2m 1 対 1 または 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"

これで、テンプレートで、ユーザー インスタンスからの facility_set または施設インスタンスからの user_set にアクセスできるようになります。

于 2012-05-28T12:21:40.917 に答える