2

私のプロジェクトのすべてのテンプレートには、匿名ユーザーとして入力した場合にのみ表示される登録ボタンがあります。このボタンをクリックすると、モーダル ウィンドウが開き、2 つの登録フォームが表示されます。問題は、機能するためにすべてのビューにこのコードを含める必要があることです。すべてのビューで登録フォームに関連するコードを繰り返さないようにする方法はありますか?

明確化: #USER REGISTRATION FORM RELATIVE および #MERCHANT REGISTRATION FORM RELATIVE としてコメントされているすべてのビューで繰り返されるコード im

私のモーダルウィンドウ

ここに画像の説明を入力

の意見の 1 つ(75 行):

def patrimonio_view(request, backend_registro_usuario, backend_registro_comerciante, success_url=None, form_class_usuario=None, form_class_comerciante=None,
         disallowed_url='registration_disallowed',
         template_name='home/patrimonio.html',
         extra_context=None):

#PATRIMONIO QUERYS
pat = patrimonio.objects.all()
ciu = ciudad.objects.all()

#USER REGISTRATION FORM RELATIVE
backend_registro_usuario = get_backend(backend_registro_usuario)
if not backend_registro_usuario.registration_allowed(request):
    return redirect(disallowed_url)
if form_class_usuario is None:
    form_class_usuario = backend_registro_usuario.get_form_class(request)

if "Registrar_usuario" in request.POST:
    form_class_usuario = form_class_usuario(data=request.POST, files=request.FILES)
    if form_class_usuario.is_valid():
        new_usuario = backend_registro_usuario.register(request, **form_class_usuario.cleaned_data)
        if success_url is None:
            to, args, kwargs = backend_registro_usuario.post_registration_redirect(request, new_usuario)
            return redirect(to, *args, **kwargs)
        else:
            return redirect(success_url)
else:
    form_class_usuario = form_class_usuario()

if extra_context is None:
    extra_context = {}
context = RequestContext(request)
for key, value in extra_context.items():
    context[key] = callable(value) and value() or value

#MERCHANT REGISTRATION FORM RELATIVE
backend_registro_comerciante = get_backend(backend_registro_comerciante)
if not backend_registro_comerciante.registration_allowed(request):
    return redirect(disallowed_url)
if form_class_comerciante is None:
    form_class_comerciante = backend_registro_comerciante.get_form_class(request)

if "Registrar_comerciante" in request.POST:
    form_class_comerciante = form_class_comerciante(data=request.POST, files=request.FILES)
    if form_class_comerciante.is_valid():
        new_comerciante = backend_registro_comerciante.register(request, **form_class_comerciante.cleaned_data)
        if success_url is None:
            to, args, kwargs = backend_registro_comerciante.post_registration_redirect(request, new_comerciante)
            return redirect(to, *args, **kwargs)
        else:
            return redirect(success_url)
else:
    form_class_comerciante = form_class_comerciante()

if extra_context is None:
    extra_context = {}
context = RequestContext(request)
for key, value in extra_context.items():
    context[key] = callable(value) and value() or value


#WE OBTAIN THE USERS FOR EACH GROUP
usuario_group = Group.objects.get(name="usuario").user_set.all()
comerciante_group = Group.objects.get(name="comerciante").user_set.all()

#RENDER
return render_to_response(template_name,
                          {'form_registro_usuario': form_class_usuario, 
                          'form_registro_comerciante': form_class_comerciante,
                           'patrimonio':pat, 
                           'ciudad':ciu,
                           'usuario_group': usuario_group,
                           'comerciante_group': comerciante_group,
                           },

                          context_instance=context)

解決策 - リファクタリングされたコード(29 行):

def patrimonio_view(request, 
     template_name='home/patrimonio.html'):

#PATRIMONIO QUERYS
pat = patrimonio.objects.all()
ciu = ciudad.objects.all()

if request.method == 'POST':
    if "Registrar_usuario" in request.POST:
        #USER REGISTRATION FORM RELATIVE
        return register_usuario()

    if "Registrar_comerciante" in request.POST:
        #MERCHANT REGISTRATION FORM RELATIVE
        return register_comerciante()

#WE OBTAIN THE USERS FROM EACH GROUP
usuario_group = Group.objects.get(
   name="usuario").user_set.all()
comerciante_group = Group.objects.get(
   name="comerciante").user_set.all()

#RENDER
return render_to_response(template_name,{
   'patrimonio':pat, 
   'ciudad':ciu,
   'usuario_group': usuario_group,
   'comerciante_group': comerciante_group,
}, context_instance=RequestContext(request))
4

2 に答える 2

2

何かが足りない場合は、修正しますと言ってください。申し訳ありませんが、他のコードは理解できません。

def patrimonio_view(request, 
         backend_registro_usuario, backend_registro_comerciante, 
         form_class_usuario=None, form_class_comerciante=None,
         disallowed_url='registration_disallowed', template_name='home/patrimonio.html',
         extra_context=None, success_url=None):

    #PATRIMONIO QUERYS
    pat = patrimonio.objects.all()
    ciu = ciudad.objects.all()

    form_class_usuario = form_class_usuario()
    form_class_comerciante = form_class_comerciante()

    if request.method == 'POST':
        if "Registrar_usuario" in request.POST:
            #USER REGISTRATION FORM RELATIVE
            return user_registration(request, 
                backend_registro_usuario, 
                disallowed_url, 
                form_class_usuario, 
                success_url
                )

        if "Registrar_comerciante" in request.POST:
            #MERCHANT REGISTRATION FORM RELATIVE
            return merchant_registration(request, 
                backend_registro_comerciante, 
                disallowed_url, 
                form_class_comerciante, 
                success_url
                )

    if extra_context is None:
        extra_context = {}
    context = RequestContext(request)
    for key, value in extra_context.items():
        context[key] = callable(value) and value() or value


    #Obtenemos los usuarios de cada grupo
    usuario_group = Group.objects.get(
       name="usuario").user_set.all()
    comerciante_group = Group.objects.get(
       name="comerciante").user_set.all()

    #RENDER
    return render_to_response(template_name,{
       'form_registro_usuario': form_class_usuario, 
       'form_registro_comerciante': form_class_comerciante,
       'patrimonio':pat, 
       'ciudad':ciu,
       'usuario_group': usuario_group,
       'comerciante_group': comerciante_group,
    }, context_instance=context)

def user_registration(request, 
        backend_registro_usuario, form_class_usuario, 
        disallowed_url, success_url):

    backend_registro_usuario = get_backend(backend_registro_usuario)
    if not backend_registro_usuario.registration_allowed(request):
        return redirect(disallowed_url)
    if form_class_usuario is None:
        form_class_usuario = backend_registro_usuario.get_form_class(request)

    form_class_usuario = form_class_usuario(data=request.POST, 
                                            files=request.FILES)
    if form_class_usuario.is_valid():
        new_usuario = backend_registro_usuario.register(request, 
            **form_class_usuario.cleaned_data)
        if success_url is None:
            to, args, kwargs = backend_registro_usuario.post_registration_redirect(request, new_usuario)
            return redirect(to, *args, **kwargs)
        else:
            return redirect(success_url)

def merchant_registration(request, 
        backend_registro_comerciante, form_class_comerciante, 
        disallowed_url, success_url):

    backend_registro_comerciante = get_backend(backend_registro_comerciante)
    if not backend_registro_comerciante.registration_allowed(request):
        return redirect(disallowed_url)
    if form_class_comerciante is None:
        form_class_comerciante = backend_registro_comerciante.get_form_class(request)

    form_class_comerciante = form_class_comerciante(data=request.POST, 
                                                    files=request.FILES)
    if form_class_comerciante.is_valid():
        new_comerciante = backend_registro_comerciante.register(request, 
            **form_class_comerciante.cleaned_data)
        if success_url is None:
            to, args, kwargs = backend_registro_comerciante.post_registration_redirect(request, new_comerciante)
            return redirect(to, *args, **kwargs)
        else:
            return redirect(success_url)
于 2013-03-14T03:40:38.987 に答える
1

複数のビューにコードを含めるには、少なくとも3つのオプションがあります。包含タグ、コンテキストプロセッサ、およびテンプレートの継承です。どちらがセットアップに最も適しているかによって異なります。

ユーザーが匿名であるかどうかを確認する必要があるため、コンテキストプロセッサは、条件付きロジックをテンプレートから除外するための最良のオプションである可能性があります。これは、プロセッサでサーバー側で実行できます。

from django.template.loader import render_to_string

def your_context_processor(request):
    if request.user.is_anonymous():
        return {'extra_context': render_to_string('anonymous-only-content.html')}
    else:
        return {}

次に、テンプレートで次のことを実行できます。

{{ extra_context }}

その変数が設定されている場合、レンダリングする匿名のみのコードが必要な場合。これらは単純な例ですが、うまくいけばいくつかのアイデアが得られます。

于 2013-03-14T03:20:57.953 に答える