我想在django admin
中创建一个包含自定义组的用户。
所以我写下面的代码:
from django.contrib.auth.models import User as AuthUser
from django.contrib.auth.models import Group
# these groups have already been created.
class TestGroup(object):
Admin = 'Admin'
Merchant = 'Merchant'
User = 'User'
class Merchant(AuthUser):
def save(self, **kwargs):
super(Merchant, self).save(**kwargs)
for group in Group.objects.all():
print group.name
# way 1
if not self.groups.filter(name=TestGroup.Merchant).exists():
print self.groups.filter(name='Merchant').exists()
g = Group.objects.get(name=TestGroup.Merchant)
g.user_set.add(self)
print self.groups.filter(name='Merchant').exists()
# way 2
if not self.groups.filter(name=TestGroup.Merchant).exists():
g = Group.objects.get(name=TestGroup.Merchant)
self.groups.add(g)
# way 3
if not self.groups.filter(name=TestGroup.Merchant).exists():
g = Group.objects.get(name=TestGroup.Merchant)
self.groups.add(g)
self.save()
我尝试了三种向用户添加组的方法。但是没有一种方法能够正常工作。
更新
您可以按照以下步骤进行测试:
创建一个名为' Merchant'在django admin
添加我的代码(在方法1中添加打印以进行测试),syncdb
等等。
在django admin中创建Merchant
。
你可以看到日志:
u'Merchant'
False
True
进入您刚刚创建的商家,您可以看到,未选择组商家(意味着此用户不会超出此群组)。
再次点击“保存” 你还会看到
u'Merchant'
False
True
向商家添加组失败,非常奇怪。
答案 0 :(得分:0)
感谢您的澄清。从我可以看到你的问题是你试图过滤和获得集团的方式。您正在检查名称是否等于对象实例:TestGroup.Merchant
何时需要字符串。尝试:
if not self.groups.filter(name='Merchant'):
g = Group.objects.get(name='Merchant')
g.user_set.add(self)
我还删除了if语句的exists
部分,因为空的查询集无论如何都会计算为布尔False
,因此exists
是多余的。
在命令提示符处导入django的Group类并尝试各种操作,直到您可以选择组。更改代码以反映在命令行中运行的任何内容。例如:
for group in Group.objects.all():
print group.name
然后更改代码以查找Group.objects.get(name='relevant_name')
。
答案 1 :(得分:0)
我调试了save方法并找到:
ValueError:"<Merchant: m23533>" needs to have a value for field "user" before this many-to-many relationship can be used.
这是说这个用户还没有保存到db,这就是为什么添加组失败了!
<强>溶液强>:
class Merchant(AuthUser):
def save(self, **kwargs):
super(Merchant, self).save(force_insert=True)
if not self.groups.filter(name=TestGroup.Merchant).exists():
g = Group.objects.get(name=TestGroup.Merchant)
g.user_set.add(self)