2012-01-04 3 views
0

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

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

+0

Вы нашли решение? – juankysmith

ответ

0
#------------------------------------------ 
# 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' 

Следующий фрагмент кода делает руководитель групп, доступные в Джанго администраторе:

#----------------------------------------- 
# 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) 
0

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

Смежные вопросы