我正在创建一个Django Web应用程序,用户可以在该Web应用程序上免费创建一个帐户。我还设置了一个演示用户,该用户已经配置好并具有附加到其帐户的数据。该演示帐户的目的是使新用户可以快速了解应用程序的功能。
现在,我想让该演示用户访问我的所有视图,但在用户保存表单时不保存到数据库。
当然,我知道有多种方法可以做到这一点。但是它们都需要我编辑多个页面或视图:
有更简单/更清洁的解决方案吗?如何以特定用户永远无法保存到数据库的方式设置我的应用程序?
我使用的解决方案
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
在save()调用之后被调用。我该如何更改?我尝试早点打电话给Super,但遇到了麻烦。
当然,我知道有多种方法可以做到这一点。但是它们都需要我编辑多个页面或视图:
好吧,如果您使用Python和Django的某些DRY功能,则不必为每个模板或视图重复逻辑。
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.
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.
使用包含标签,您可以将隐藏/显示表单提交按钮的逻辑隔离在一个位置,并可以在演示用户所在的多个页面中引用您的自定义标签。
这些只是实现此逻辑的一些方法,而不必一遍又一遍地重复自己。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句