无法将组添加到auth用户

时间:2014-08-20 07:00:19

标签: python django python-2.7 django-admin

我想在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()

我尝试了三种向用户添加组的方法。但是没有一种方法能够正常工作。

更新

您可以按照以下步骤进行测试:

  1. 创建一个名为' Merchant'在django admin

  2. 添加我的代码(在方法1中添加打印以进行测试),syncdb等等。

  3. 在django admin中创建Merchant。 你可以看到日志:

    u'Merchant'
    False
    True

  4. 进入您刚刚创建的商家,您可以看到,未选择组商家(意味着此用户不会超出此群组)。

  5. 再次点击“保存” 你还会看到

    u'Merchant'
    False
    True

  6. 向商家添加组失败,非常奇怪。

2 个答案:

答案 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是多余的。

编辑:发表评论后,我回到了我提出的问题的评论。您正在为变量分配字符串,而不是创建组。如果已创建组,则TestGroup类完全冗余,应删除。

在命令提示符处导入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)