1

私は食品レシピのアプリケーションを作成しており、レシピで同じ html を実行し、モーダル ウィンドウにコメントを含めようとしています。問題は、送信テンプレートを指定すると失敗し、コメントがデータベースに保存されないことです。

urls.py

urlpatterns = patterns('recetas.apps.menus.views',
    url(r'^recetas/$','recetas_view',name='vista_recetas'),
    url(r'^reporte/$','reporte_receta',name='receta_reporte'),
    url(r'^receta/(?P<id_receta>\d+)$','detalle_receta', name='vista_detalle'),
)

この URL を呼び出す HTML コード

<td><a href='/receta/{{ receta.id }}'>{{ receta.titulo }}</a></td>

ビュー.py

def detalle_receta(request, id_receta):
    dato = get_object_or_404(Receta, pk=id_receta)
    comentarios = Comentario.objects.filter(receta=dato)
    if request.POST:
        if request.POST.get('cancel', id_receta):
            return HttpResponseRedirect('/receta/{0}'.format(id_receta))
        form = ComentarioForm(request.POST)
        if form.is_valid():
           form.save()
           return HttpResponseRedirect('/receta/{0}'.format(id_receta))
    else:
        form = ComentarioForm(initial={'receta': id_receta})

    cxt = {'receta':dato,'comentarios':comentarios,'form':form}
    return render_to_response('menus/receta.html', cxt, context_instance=RequestContext(request))

receta.html

{% extends 'base.html' %}
{% block titulo %}{{ receta.titulo }}{% endblock titulo %}
{% block estatico %}
<link rel='stylesheet' href='{{ STATIC_URL }}css/receta.css' type='text/css'>
<link rel='stylesheet' href='{{ STATIC_URL }}css/modal.css' type='text/css'>
<script type='text/javascript'>

    function despliegaModal(valor) {
        var elem = document.getElementById("bgVentanaModal");
        elem.style.visibility = valor;
        }
</script>
{% endblock estatico %}
{% block contenido %}
<div id="bgVentanaModal">
    <div id="ventanaModal">
        <form action="/receta/{{ receta.id_receta }}" method="POST">
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit" value="Grabar">
            <input name="cancel" type="submit" value="Cancelar">
        </form>
    </div>
</div>
<div id=receta>
    <div id="nombre_receta">
        <h1>{{receta.titulo|title}}</h1>
        <hr>
    </div>
    <div id='ingredientes'>
        <h2>Ingredientes</h2>
        <p>{{ receta.ingredientes }}</p>
    </div>
    <div id='imagen'>
        <img src='{{MEDIA_URL}}{{receta.imagen}}' width="480" height="300" >
    </div>
    <div id='preparacion'>
        <h2>Preparación</h2>
        <p>{{ receta.preparacion }}</p>
    </div>
    <div id='comentarios'>
        <h2>Comentarios</h2>
        {% for item in comentarios %}
            <p>{{ item.texto}}</p>
        {% empty %}
            <p>Sin Comentarios registrados</p>
        {% endfor %}
        {% if user.is_authenticated %}
            <a href="javascript:despliegaModal('visible');">Agregue su comentario</a>
        {% endif %}
    </div>
    <div id="pie">
        <hr>
        <p>Receta Registrada el {{ receta.tiempo_registro|date:'SHORT_DATETIME_FORMAT' }} por {{ receta.usuario }}</p>
    </div>
</div>
{% endblock contenido %}

キャンセルキーを与えるまですべてが機能し、POST は検証されません。

4

2 に答える 2

1

問題はあなたにあると思いますview.py。特にこの部分では:

if request.POST.get('cancel', id_receta):
    return HttpResponseRedirect('/receta/{0}'.format(id_receta))

それifFalse値になることは決してないので、コメントが保存されることはありません。これは、dict.get関数がどのように機能するかと関係があります。

get(key [、default])

キーがディクショナリにある場合はキーの値を返し、そうでない場合はデフォルトを返します。defaultが指定されていない場合、デフォルトでNoneに設定されるため、このメソッドでKeyErrorが発生することはありません。

したがって、クリックGrabarするとデフォルト値(id_receta)が表示されます。代わりに次を試してください。

if request.POST.get('cancel'): # Default to None
    return HttpResponseRedirect('/receta/{0}'.format(id_receta))

Cancelar回避策は、JavaScriptのボタンを使用して、テンプレートをクリックしたときにリダイレクトすることです。

views.py

def detalle_receta(request, id_receta):
    dato = get_object_or_404(Receta, pk=id_receta)
    comentarios = Comentario.objects.filter(receta=dato)
    if request.POST:
        # if request.POST.get('cancel', id_receta):
        #    return HttpResponseRedirect('/receta/{0}'.format(id_receta))
        form = ComentarioForm(request.POST)
        if form.is_valid():
           form.save()
           return HttpResponseRedirect('/receta/{0}'.format(id_receta))
    else:
        form = ComentarioForm(initial={'receta': id_receta})

    cxt = {'receta':dato,'comentarios':comentarios,'form':form}
    return render_to_response('menus/receta.html', cxt, context_instance=RequestContext(request))

receta.html

...
...
<form action="/receta/{{ receta.id_receta }}" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Grabar">
    <input type="button" value="Cancelar" onclick="window.location.href='/receta/{{ dato.id }}'"/>>
</form>
...
...

もちろん、URLをハードコーディングする代わりにget_absolute_urlを使用する必要あります。

于 2012-09-05T20:45:25.867 に答える
0

セザールを助けてくれてありがとう、あなたの答えは私を助けてくれますが、私のエラーは receta.html の変数にあります

{{ receta.id }}あり、ボタンでは同じです 正しいです

<form action="/receta/{{ receta.id }}" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Grabar"/>
    <input type="button" value="Cancelar" onclick="window.location.href='/receta/{{ receta.id }}'"/>
</form>

あなたの助けとエラーを見つけた友人に感謝します

于 2012-09-07T21:02:09.933 に答える