Джанго Аут: руководитель группы - PullRequest
0 голосов
/ 04 января 2012

В моем приложении около ста пользователей и от 10 до 20 групп. Теперь клиент хочет предоставить особые привилегии лидерам группы.

Как бы вы это сделали (многократно)?

Ответы [ 2 ]

0 голосов
/ 09 января 2012
#------------------------------------------
# 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 /1558872/django-modelform-dlya-polei-mnogie-ko-mnogim
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)
0 голосов
/ 04 января 2012

Вы можете создать новую модель, расширяющую класс group, и добавить к ней новый внешний ключ для user (лидера)

...