2016-08-01 48 views
1

我正在创建一个Django Web应用程序,用户可以在其中免费创建一个帐户。我还设置了一个已经配置好的演示用户,并在其帐户中附加了数据。此演示帐户的目的是为新用户快速了解应用程序的功能。创建无法保存到数据库的Django演示用户

现在我想让这个演示用户访问我的所有视图,但不保存到数据库时,用户保存表单。

当然,有很多方法可以做到这一点,我知道了。但他们都需要我来编辑多个页面或视图:

  • 当保存的表单检查它是否是演示的用户,如果是:不保存
  • 删除从我的模板保存按钮时,演示用户已登录

是否有更简单/更清洁的解决方案来执行此操作?如何以特定用户无法保存到数据库的方式设置我的应用程序?

我用

marcusshep的想法为我提供了解决方案的解决方案。我为需要加载表单的页面创建了以下视图,但在点击保存按钮时未保存。直到现在,我无法做到这一点。这时页面下方将呈现303立即

class FormViewOPRadio(FormView): 
def dispatch(self, request, *args, **kwargs): 
    # Return 403 for demo user 
    temp = 'temp' 
    if self.request.user.email == '[email protected]': 
     raise PermissionDenied 
    else: 
     return super(FormViewOPRadio, self).dispatch(request, *args, **kwargs) 


class UpdateViewOPRadio(UpdateView): 
def dispatch(self, request, *args, **kwargs): 
    # Return 403 for demo user 
    temp = 'temp' 
    if self.request.user.email == '[email protected]': 
     raise PermissionDenied 
    else: 
     return super(UpdateViewOPRadio, self).dispatch(request, *args, **kwargs) 


class DeleteViewOPRadio(DeleteView): 
def dispatch(self, request, *args, **kwargs): 
    # Return 403 for demo user 
    temp = 'temp' 
    if self.request.user.email == '[email protected]': 
     raise PermissionDenied 
    else: 
     return super(DeleteViewOPRadio, self).dispatch(request, *args, **kwargs) 

此外也有一些网页应该是无法访问的,我用

from braces.views import UserPassesTestMixin 

class UserNotDemoUser(UserPassesTestMixin): 
raise_exception = True 

def test_func(self, user): 
    return user.email != '[email protected]' 

我试过

我创建以下页面显示的页面应该加载窗体,但在按下保存按钮时不保存

class FormViewOPRadio(FormView): 
def form_valid(self, form): 
    # Return 403 for demo user 
    if self.request.user.email == '[email protected]': 
     raise PermissionDenied 
    else: 
     return super(FormViewOPRadio, self).form_valid(form) 

class AddStream(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, FormViewOPRadio): 
"""Is the page used to add a Stream""" 
template_name = 'opradioapp/addoreditstream.html' 
form_class = AddStreamForm 
success_url = reverse_lazy('opradioapp_home') 
success_message = "De stream is opgeslagen" 

# Validate if the user is the maintainer of the station 
def test_func(self): 
    user = self.request.user 
    mainuserstation = MainUserStation.objects.get(slugname=self.kwargs['mainuserstationslug']) 
    if mainuserstation.maintainer == user: 
     return True 
    else: 
     return False 

def form_valid(self, form): 
    user = self.request.user 
    mainuserstation = MainUserStation.objects.get(slugname=self.kwargs['mainuserstationslug']) 
    userstream = UserStream() 
    userstream.mainuserstation = mainuserstation 
    userstream.name = form.cleaned_data['name'] 
    userstream.slugname = 'temp' 
    userstream.description = form.cleaned_data['description'] 
    userstream.save() 

    member = Member.objects.get(user=user, mainuserstation=mainuserstation) 
    member.streamavailable.add(userstream) 
    member.save() 
    return super(AddStream, self).form_valid(form) 

做当这样

 if self.request.user.email == '[email protected]': 
     raise PermissionDenied 

被保存()调用后调用。我该如何改变这一点?我早些时候尝试过超级电话,但比我碰到问题。

回答

1

当然,有多种方式可以做到这一点,我知道。但他们都需要我来编辑多个页面或视图:

那么,你会不会有重复的逻辑,每个模板或视图,如果你使用Python和Django的某些DRY功能。

Class Based View Inheritance

class CheckForDemoUser(View): 
    def dispatch(self, request, *args, **kwargs): 
     # check for demo user 
     # handle which ever way you see fit. 
     super(CheckForDemoUser, self).dispatch(request, *a, **kw) 

class ChildClass(CheckForDemoUser): # notice inheritance here 
    def get(request, *args, **kwargs): 
     # continue with normal request handling 
     # this view will always check for demo user 
     # without the need to repeat yourself. 

Function Decorators

def check_for_demo_user(func): 
    def func_wrapper(request, *args, **kwargs): 
     # implement logic to determine what the view should 
     # do if the request.user is demo user. 
    return func_wrapper 


@check_for_demo_user 
def my_view(request, *args, **kwargs): 
    # automatic checking happening before view gets to this point. 

随着Inclusion Tags可以隔离隐藏的逻辑/显示形式提交按钮在一个地方,是指在多个页面中的自定义标签的演示用户将会开启。

这些只是一些方法,你可以实现这个逻辑,而无需一遍又一遍地重复自己。

+0

当我使用CB视图时,我使用了第一种解决方案。我将我的解决方案添加到原始问题中。 – Wenze

+0

太棒了! – marcusshep

+0

我实际上遇到过这种情况不符合我的预期。 PermissionDenied已呈现,但表单已保存。所以函数调用的顺序是错误的。任何想法如何我可以解决这个问题? – Wenze

相关问题