10

過去 3 日間、Google と Stackoverflow を検索してきましたが、似たようなものは見つかりませんでした。django のグループと権限を拡張または使用したいと考えています。

チームとユーザーが異なるいくつかのプロジェクトがあるとします。

class Project(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField(max_length=100)

class Team(models.Model):
    project = models.ForeignKey(Project)
    members = models.ManyToManyField(User)
    name = models.CharField(max_length=100)
    permission = models.ManyToManyField(Permission)

今 - すべてが順調です。今私が欲しいのは、django によって配信された既存の Auth.Group を拡張してrequest.user.has_perm...、直接的な方法を使用できるようにすることです。

それでは、 Team-Modelを次のように変更しましょう

class Team(Group):
    project = models.ForeignKey(Project)
    members = models.ManyToManyField(User)

これにより、既存のグループが拡張されます。nameandフィールドはGroup-Modelpermissionsから直接取得されます。新しいTeamを作成すると、Groupも追加されます。それは素晴らしいことです。

追加できるカスタムsaveメソッドを使用すると、 にuserリストされmembersている が作成されたグループに追加されTeam/Groupに付与された権限が取得されます。

今私の問題は、グループnameのフィールドが一意であるため、各プロジェクトに管理者チームを追加できなかったことです。

フロントエンドに別の名前フィールドを追加して、 Group-Modelの名前フィールドに一意の文字列を生成することを考えました。しかし、うーん....複数のカスタム グループのためのより良い解決策はありますか? ひょっとして何か思いついた?前もって感謝します!

4

1 に答える 1

5

グループ名は一意にする必要があります。つまり、別の名前フィールドを作成して、すべてのサブグループで一意にする方法を見つけたということです。

もう 1 つの方法は、既存の名前フィールドを利用して、独自の特殊文字を追加することです。たとえば、グループ名admin#project1members#project1などを使用します (注: グループ名に「#」を使用できるかどうかはわかりません。許可されている任意の特殊文字を選択できます)。

したがって、作成するたびに、モデルのメソッドでTeam名前フィールドをサフィックス#<project_name>で更新します。Teamsave()

より適切に表示するに__unicode__()は、グループ名の最初の部分のみを返すメソッドを追加できます。例:

class Team(Group):
    ...
    def __unicode__(self):
        try:
            return self.name.split('#')[0]
        except:
            #something wrong!
            return self.name
于 2012-10-15T10:09:32.600 に答える