Django 身份:组长

发布于 2024-12-24 16:24:08 字数 77 浏览 2 评论 0原文

我的应用程序有数百个用户和大约 10 到 20 个组。现在客户想给予组长特殊的特权。

您将如何做到这一点(以可重用的方式)?

My application has some hundred users and about 10 to 20 groups. Now the customer wants to give special privileges to group leaders.

How would you do this (in a reusable way)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

背叛残局 2024-12-31 16:24:08

您可以创建一个扩展 group 类的新模型,并将其添加到 user (领导者)的新外键

You can create a new model that extends the group class and add it a new foreign key to a user (the leader)

峩卟喜欢 2024-12-31 16:24:08
#------------------------------------------
# models.py of fooapp

from django.db import models
from django.contrib.auth.models import User, Group

class GroupLeader(models.Model):
    user=models.OneToOneField(User, primary_key=True)
    groups=models.ManyToManyField(Group, related_name='leaders')
    class Meta:
        verbose_name_plural=u'Group Leaders'

下一个片段使组领导者可以在 django admin 中使用:

#-----------------------------------------
# admin.py of fooapp
# See http://stackoverflow.com/questions/2216974/django-modelform-for-many-to-many-fields
from django.contrib.auth.admin import GroupAdmin
from fooapp.models import GroupLeader

class MyGroupForm(forms.ModelForm):
    class Meta:
        model=Group
    leaders = forms.ModelMultipleChoiceField(queryset=User.objects.all())

    def __init__(self, *args, **kwargs):
        if 'instance' in kwargs:
            # We get the 'initial' keyword argument or initialize it
            # as a dict if it didn't exist.                
            initial = kwargs.setdefault('initial', {})
            # The widget for a ModelMultipleChoiceField expects
            # a list of primary key for the selected data.
            initial['leaders'] = [t.pk for t in kwargs['instance'].leaders.all()]

        forms.ModelForm.__init__(self, *args, **kwargs)
        self.fields['leaders'].widget.attrs['size']=10

    def save(self, commit=True):
        instance = forms.ModelForm.save(self, False)

        # Prepare a 'save_m2m' method for the form,
        old_save_m2m = self.save_m2m
        def save_m2m():
           old_save_m2m()
           instance.leaders.clear()
           for leader_user in self.cleaned_data['leaders']:
               leader_obj, created = GroupLeader.objects.get_or_create(pk=leader_user.pk) # User object to GroupLeader object
               instance.leaders.add(leader_obj)
        self.save_m2m = save_m2m

        # Do we need to save all changes now?
        if commit:
            instance.save()
            self.save_m2m()


        return instance

class MyGroupAdmin(GroupAdmin):
    form=MyGroupForm
admin.site.unregister(Group)
admin.site.register(Group, MyGroupAdmin)
#------------------------------------------
# models.py of fooapp

from django.db import models
from django.contrib.auth.models import User, Group

class GroupLeader(models.Model):
    user=models.OneToOneField(User, primary_key=True)
    groups=models.ManyToManyField(Group, related_name='leaders')
    class Meta:
        verbose_name_plural=u'Group Leaders'

The next snippet makes the group leaders available in django admin:

#-----------------------------------------
# admin.py of fooapp
# See http://stackoverflow.com/questions/2216974/django-modelform-for-many-to-many-fields
from django.contrib.auth.admin import GroupAdmin
from fooapp.models import GroupLeader

class MyGroupForm(forms.ModelForm):
    class Meta:
        model=Group
    leaders = forms.ModelMultipleChoiceField(queryset=User.objects.all())

    def __init__(self, *args, **kwargs):
        if 'instance' in kwargs:
            # We get the 'initial' keyword argument or initialize it
            # as a dict if it didn't exist.                
            initial = kwargs.setdefault('initial', {})
            # The widget for a ModelMultipleChoiceField expects
            # a list of primary key for the selected data.
            initial['leaders'] = [t.pk for t in kwargs['instance'].leaders.all()]

        forms.ModelForm.__init__(self, *args, **kwargs)
        self.fields['leaders'].widget.attrs['size']=10

    def save(self, commit=True):
        instance = forms.ModelForm.save(self, False)

        # Prepare a 'save_m2m' method for the form,
        old_save_m2m = self.save_m2m
        def save_m2m():
           old_save_m2m()
           instance.leaders.clear()
           for leader_user in self.cleaned_data['leaders']:
               leader_obj, created = GroupLeader.objects.get_or_create(pk=leader_user.pk) # User object to GroupLeader object
               instance.leaders.add(leader_obj)
        self.save_m2m = save_m2m

        # Do we need to save all changes now?
        if commit:
            instance.save()
            self.save_m2m()


        return instance

class MyGroupAdmin(GroupAdmin):
    form=MyGroupForm
admin.site.unregister(Group)
admin.site.register(Group, MyGroupAdmin)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文