创建无法保存到数据库的Django demouser

2024-04-20 04:07:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个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,但后来遇到了问题。你知道吗


Tags: 用户selfformreturnifdemorequestdef
1条回答
网友
1楼 · 发布于 2024-04-20 04:07:59

Off course there are multiple ways of doing this that I know of. But they all require me to edit multiple pages or views:

好吧,如果您利用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,您可以将隐藏/显示表单提交按钮的逻辑隔离在一个位置,并在演示用户将在的多个页面中引用您的自定义标记。你知道吗

这些只是一些方法,你可以实现这个逻辑,而不必重复一遍又一遍。你知道吗

相关问题 更多 >