2014-10-17 40 views
1

在我的项目中,我们需要某种类型的系统来允许/拒绝对URL的某些访问。Django - 如何拒绝直接访问记录的用户到特定的URL

例如,我们想制作某种向导。

用户在第一个屏幕(A屏幕)上输入第一个对象,然后按“继续”。 现在我们得到数据并重定向到第二个屏幕(B屏幕),在那里我们用户应该输入第二个对象。 向导继续... 问题是,如果我们这样做,用户可以在浏览器中写入B url并访问B屏幕。用户已经登录了,但即便如此,我们也不希望他不通过屏幕即可到达那里。

我们不知道如何做到这一点或在互联网上寻找这个。我们只知道用户会话这样做。

还有别的办法吗?一些帮助?

在此先感谢。

+2

这有什么不好使用会话? – 2014-10-17 17:18:53

+1

你看过[django的表单向导](https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/)吗? – dgel 2014-10-17 17:25:47

回答

1

我认为外键是你寻找的解决方案'A'作为'B'的外键,'B'的URL传递'A'的id作为这样的参数url(r'^A/(?P<A_id>[0-9]+) this方式第一用户将输入数据在'A'它将被存储在数据库中,然后访问'B'将通过ID'A'可用。阅读更多关于外键here

1

目前,我正在从事数学家庭作业项目。有三种类型的用户。教授,学生和管理员。以下片段将拒绝用户根据用户的类型访问网址。修改后,您必须将此方法装饰器添加到服务于http请求的请求方法中。

def deny_a_thing(function): 
    def wrapper(request, *args, **kw): 
     try: 
      test = User.objects.get(username=request.user) # This will get the username 
     except ObjectDoesNotExist: 
      raise Http404         # return 404, if the user doesn't exist. You can change it to anything 
     if not request.user.is_authenticated():    # If the user is not authenticated, return to the rootm. You can also change this. 
      return HttpResponseRedirect("/") 
     try: 
      if test.groups.filter()[0].name != "professors": # Add your test here. E.g: If user saved A, don't go B. 
       raise Http404 
     except IndexError: 
      raise Http404 
     else: 
      return function(request, *args, **kw) 
    return wrapper 

以下内容添加到您的方法

@deny_a_thing     # This will deny the user from doing the thing you didn't want the user to do. 
def some_page_request(request): 
    return HttpResponse("OMG") 

检查这个link一个简单的装饰