创建无法保存到数据库的Django演示用户

Wenze

我正在创建一个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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django:无法保存到数据库

来自分类Dev

Django:无法保存到数据库

来自分类Dev

Django - 无法加载保存到数据库的图像

来自分类Dev

无法从 Django ModelForm 保存到数据库

来自分类Dev

无法使用 django 将图像保存到数据库

来自分类Dev

servlet无法保存到数据库

来自分类Dev

Django:保存到数据库connundrun

来自分类Dev

表单未将用户数据保存到数据库 Django 中

来自分类Dev

新创建的用户不会保存到 Firebase 数据库

来自分类Dev

Django Model Form不是将数据保存到数据库,而是创建了对象

来自分类Dev

Django - 简单用户注册不起作用 [不保存到数据库]

来自分类Dev

Django模型无法实时将数据持久保存到数据库

来自分类Dev

创建不将数据保存到数据库的功能

来自分类Dev

如何从HTML页面创建PNG图像并将其使用Django保存到数据库中?

来自分类Dev

将新用户持久保存到数据库

来自分类Dev

CakePHP无法将数据保存到数据库

来自分类Dev

数据无法保存到数据库(Spring MVC + Thymeleaf)

来自分类Dev

无法将数据保存到 Firebase 数据库

来自分类Dev

Django Admin未将数据保存到数据库

来自分类Dev

数据未使用Django表单保存到数据库

来自分类Dev

Django将数据保存到数据库

来自分类Dev

Django - .save() 不将数据保存到数据库

来自分类Dev

Django - 表单数据不会保存到数据库

来自分类Dev

createObjectURL创建的Blob保存到数据库

来自分类Dev

用户创建的动态数据库-django

来自分类Dev

用户创建的动态数据库-django

来自分类Dev

Rails 4:无法将记录保存到数据库

来自分类Dev

标记行为无法保存到数据库

来自分类Dev

无法使用Laravel Api保存到数据库

Related 相关文章

热门标签

归档