2016-08-01 7 views
1

私は無料でアカウントを作成できる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 

を保存()呼び出しの後に呼び出されます。これをどうやって変更できますか?私はスーパーを早く呼び出すことを試みたが、問題に遭遇した。

答えて

1

もちろん、私が知っているこれを行うには複数の方法があります。しかし、彼らすべてが複数のページまたはビュー編集する私を必要とします。

さてを、あなたは、PythonとDjangoの特定のDRY機能を利用場合は、すべてのテンプレートまたはビューのロジックを繰り返す必要はありません。フォームが一つの場所にボタンを提出し、複数のページで、カスタムタグデモ・ユーザーを参照してください示す/隠れのロジックを分離することができますInclusion Tags

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. 

になります。

これは、何度も繰り返すことなくこのロジックを実装できる方法の一部です。

+0

CBビューを使用しているので、私は最初の解決方法を使用しました。元の質問に私のソリューションを加えました。 – Wenze

+0

それは素晴らしいです! – marcusshep

+0

これは実際に私が期待した通りに動作していないことに遭遇しました。 PermissionDeniedはレンダリングされましたが、フォームは既に保存されていました。したがって関数は間違った順序で呼び出されます。どのように私はこれを解決することができますか? – Wenze

関連する問題