Python Django规则设置问题:自定义用户模型的\u perm是否始终为False

Python Django规则设置问题:自定义用户模型的\u perm是否始终为False,python,django,debugging,django-rules,Python,Django,Debugging,Django Rules,我是Django的新手。我一直在尝试设置一个自定义用户模型,但在尝试访问页面时,却一直使用404。以下是设置的外观: 自定义用户模型 class User(AbstractBaseUser, PermissionsMixin): class Meta: verbose_name = _('user') verbose_name_plural = _('users') id = models.UUIDField(primary_key=True,

我是Django的新手。我一直在尝试设置一个自定义用户模型,但在尝试访问页面时,却一直使用404。以下是设置的外观:

自定义用户模型

class User(AbstractBaseUser, PermissionsMixin):

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)

    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)

    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )

    is_active = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email
设置.py

AUTHENTICATION_BACKENDS = (
    'rules.permissions.ObjectPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)
已安装的应用程序

INSTALLED_APPS = [
    # ...
    'rules.apps.AutodiscoverRulesConfig',
]
rules.py

@rules.predicate
def is_organisation_member(user, organisation):
    """Check if user is an active organisation member"""
    m = get_if_exists(
        OrganisationMember,
        user=user,
        organisation=organisation,
        organisation__state=Organisation.LifecycleState.ACTIVE
    )
    if not m:
        return False
    if not m.is_active:
        return False
    return True

rules.add_perm('organisations.member',  (is_authenticated & is_active & is_organisation_member))
views.py

def get_organisation_by_slug(request, *args, **kwargs):
    return get_object_or_404(Organisation, workspace_name=kwargs['workspace'])

@permission_required('organisations.member', fn=get_organisation_by_slug)
def OrganisationView(request, workspace):
    # ...
url.py

urlpatterns = [
    path('admin/', admin.site.urls),

    # ...

    # organisation
    path('<str:workspace>', v.OrganisationView, name="organisation-show"),
    # ...
]
urlpatterns=[
路径('admin/',admin.site.url),
# ...
#组织机构
路径(“”,v.OrganizationView,name=“Organization show”),
# ...
]
根据调试,
is_organization_member
返回True,但用户在尝试查看页面时仍会收到404错误(没有django规则
所需的权限
修饰页面)。你知道为什么我会收到404的回复吗

如果没有django规则的
权限,\u需要
装饰程序,页面将正常工作

那只说了一半!当发电机被拆下且存在现有测试数据时,它工作正常。但是当查询没有返回任何内容时,404错误就出现了

我错误地认为问题在于设置规则,但在删除装饰程序后,错误仍然存在。我以前没有看到这个错误,因为我总是自动生成测试数据(项目列表),但这次没有。因此,在查看view函数后,我意识到当项目查询返回空列表时,我提出了一个404错误:

@permission_required('organisations.member', fn=get_organisation_by_slug)
def OrganisationView(request, workspace):

    # Query strings:
    # Extract 'tab' value appended to url as
    # ?tab=projects
    tab = request.GET.get('tab', '')
    
    # Get organisation
    try:
        o = Organisation.objects.get(workspace_name=workspace)
    except Organisation.DoesNotExist:
        raise Http404("Not found.")

    if tab == 'projects':
        # Get project list 
        try:
            p = Project.objects.filter(organisation__workspace_name=workspace) \
                .order_by('-created_at')
        except Project.DoesNotExist:
            raise Http404("Not found")
    else:
        raise Http404("Not found...") # ERROR CAUSED BY THIS LINE
        # To fix the error, I have removed the above line and added the below query
        # p = Project.objects.filter(organisation__workspace_name=workspace) \
        #     .order_by('-created_at')

    # Set context 
    context = {
        'o': o,
        'projects': p
    }

    return render(request, 'bb/home.html', context)

因为我确信我的观点是正确的,所以我没有发布完整的函数,这使得其他人很难发现错误。在添加
has_perm(self,perm,obj=None)后,我意识到错误出现在视图中:将True
返回到用户模型,但仍然得到一个404错误。

如果你的url.py错误,或者如果你确实得到而不是POST或类似的东西,你会像通常得到这个错误一样向我们显示完整的错误吗?当然:
页面未找到(404)请求方法:获取请求URL:http://127.0.0.1:8000/abc1 未找到引发者:bb.views.OrganizationView您看到此错误,因为您的Django设置文件中有DEBUG=True。将其更改为False,Django将显示一个标准404页面。
url为:。abc1是组织的名称,它位于数据库中。当我删除装饰器时,url会工作。请添加您的url。p当然,完成。谢谢@AyanSh感谢您回顾这个问题,当您询问url.py时,我开始怀疑这个问题是否在不同的地方,并开始在不同的地方调整代码。