我正在创建一个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
被保存()调用后调用。我该如何改变这一点?我早些时候尝试过超级电话,但比我碰到问题。
当我使用CB视图时,我使用了第一种解决方案。我将我的解决方案添加到原始问题中。 – Wenze
太棒了! – marcusshep
我实际上遇到过这种情况不符合我的预期。 PermissionDenied已呈现,但表单已保存。所以函数调用的顺序是错误的。任何想法如何我可以解决这个问题? – Wenze