【问题标题】:Can not add a group to a auth user无法将组添加到身份验证用户
【发布时间】:2014-08-20 07:00:19
【问题描述】:

我想在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. 在 django admin 中创建一个名为“Merchant”的组

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

  3. 在 django 管理员处创建一个Merchant。 你可以看到日志:

    u'Merchant'
    False
    True

  4. 输入刚才创建的商户,可以看到,组商户没有被选中(表示这个用户没有超出这个组)。

  5. 再次点击保存, 你仍然会看到

    u'Merchant'
    False
    True

加群到商户失败,很奇怪。

【问题讨论】:

  • 它是否可能与 django 自己的 Group 模型混淆了,User 模型已经与之共享关系?
  • @cms_mgr 在发布此问题之前,我从自定义XXXGroup 中删除了公司名称XXX。我已经更新了我的问题。
  • 如果发布的代码现在是准确的,那么您的 TestGroup 模型没有外键关系。您已经创建了三个变量:AdminMerchantUser,并为这些变量分配了同名的字符串。
  • @cms_mgr TestGroup 仅用于定义组名。具有这些名称的组已在项目启动时创建。

标签: python django python-2.7 django-admin


【解决方案1】:

感谢您的澄清。据我所知,您的问题是您尝试过滤和获取组的方式。您正在检查名称是否等于对象实例: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')

【讨论】:

  • self.groups.filter(name='Merchant') 等于 self.groups.filter(name=TestGroup.Merchant)。你可以试一试,结果是一样的。
  • 您可以按照我的步骤进行操作。
  • 绝对不一样。一个返回对象,另一个返回一个字符串。根据您的模型的 unicode 方法,它们可能看起来相同,但它们不会通过相等性测试。尝试在命令行输入type(TestGroup.Merchant) 看看我的意思。
  • 我在我的步骤中使用了TestGroup.Merchant'Merchant',结果相同。>>> type(TestGroup.Merchant) <type 'str'> >>> type('Merchant') <type 'str'>。至少,当您将它们用作参数时它们是相同的
  • 我绝对不是在创建组,因为我已经创建了它们。我总是将字符串或花药类型变量分配给django filter,我看不出有什么不合理的地方。
【解决方案2】:

我调试保存方法并发现:

值错误:"<Merchant: m23533>" needs to have a value for field "user" before this many-to-many relationship can be used.

表示该用户尚未保存到数据库,这就是添加组失败的原因!

解决方案

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2020-01-27
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多