我正在创建一个djangoweb应用程序,用户可以在上面免费创建一个帐户。我还设置了一个演示用户,它已经配置好了,并且有数据附加到它的帐户上。这个演示帐户的目的是让新用户快速了解应用程序可以做什么。你知道吗
现在,我想让这个演示用户访问我的所有视图,但不保存到数据库时,用户保存一个表单。你知道吗
当然,我知道有很多方法可以做到这一点。但它们都要求我编辑多个页面或视图:
有更简单/更干净的解决方案吗?如何以特定用户永远无法保存到数据库的方式设置应用程序?你知道吗
我使用的解决方案
马库舍普的想法为我提供了一个解决方案。我为点击save按钮时应该加载表单但不保存的页面创建了以下视图。直到现在我还没能做到。此时,下面的页面将立即呈现303
class FormViewOPRadio(FormView):
def dispatch(self, request, *args, **kwargs):
# Return 403 for demo user
temp = 'temp'
if self.request.user.email == 'demo@opradio.nl':
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 == 'demo@opradio.nl':
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 == 'demo@opradio.nl':
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 != 'demo@opradio.nl'
我尝试的
我为点击save按钮时应该加载表单但不保存的页面创建了以下视图
class FormViewOPRadio(FormView):
def form_valid(self, form):
# Return 403 for demo user
if self.request.user.email == 'demo@opradio.nl':
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 == 'demo@opradio.nl':
raise PermissionDenied
在save()调用之后调用。我怎样才能改变这个?我想早点打电话给super,但后来遇到了问题。你知道吗
好吧,如果您利用Python和Django的某些DRY特性,就不必为每个模板或视图重复逻辑。你知道吗
Class Based View Inheritance
Function Decorators
使用Inclusion Tags,您可以将隐藏/显示表单提交按钮的逻辑隔离在一个位置,并在演示用户将在的多个页面中引用您的自定义标记。你知道吗
这些只是一些方法,你可以实现这个逻辑,而不必重复一遍又一遍。你知道吗
相关问题 更多 >
编程相关推荐