Мое приложение имеет около ста пользователей и около 10 до 20 групп. Теперь клиент хочет предоставить особые привилегии лидерам групп.Django auth: Лидер группы
Как вы это сделаете (в многоразовом варианте)?
Мое приложение имеет около ста пользователей и около 10 до 20 групп. Теперь клиент хочет предоставить особые привилегии лидерам групп.Django auth: Лидер группы
Как вы это сделаете (в многоразовом варианте)?
#------------------------------------------
# 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)
Вы можете создать новую модель, которая расширяет group
класс и добавить ему новый внешний ключ к user
(лидеру)
Вы нашли решение? – juankysmith