17

AjaxFormプラグインを使用して、更新せずにフォームを送信しています。お気に入り:

$('#my_form_id').ajaxForm(function(){

        //something on success or fail
    });

これは正しく機能します。[送信]ボタンをクリックすると、フォームデータが更新されずに保存されます。しかし、この前に; テンプレートファイルに次のようなdjangoメッセージがありました:

{% for message in messages %}
    <div id="notice" align="center">
        {{ message }}
    </div>
{% endfor %}

このコードが行うことは、投稿が正しく保存された場合、または何かが失敗した場合に通知を表示することです。

今; 私はそれをすることはできません。これらのメッセージタグをajax関数で使用する方法がわかりません。

投稿を保存するだけです。通知はありません。

ありがとうございました。

編集 :

add_post url:url(r'^admin/post/add/$', view='add_post',name='add_post'),

関連ビュー:

@login_required(login_url='/login/')
def add_post(request):
    template_name = 'add.html'
    owner = request.user
    if request.method == "POST":
        form = addForm(request.POST)
        if form.is_valid():
            titleform = form.cleaned_data['title']
            bodyform = form.cleaned_data['body']
            checkform = form.cleaned_data['isdraft']

            n = Post(title=titleform, body=bodyform, isdraft=checkform, owner=owner)
            n.save()
            messages.add_message(request, messages.SUCCESS,
                'New post created successfully!')
        else:
            messages.add_message(request, messages.WARNING,
                'Please fill in all fields!')
    else:
        form = addForm()
    return render_to_response(template_name, {'form': form, 'owner': owner,},
        context_instance=RequestContext(request))
4

5 に答える 5

15

これらは私が問題を解決するのを助けたツール/方法です。まず、ヘルパーユーティリティメソッドがありますrender_to_json

# `data` is a python dictionary
def render_to_json(request, data):
    return HttpResponse(
        json.dumps(data, ensure_ascii=False),
        mimetype=request.is_ajax() and "application/json" or "text/html"
    )

ポップアップメッセージに必要なhtmlをレンダリングするためのmessages.htmlテンプレートがあります。

{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}

AJAXリクエストに応答してメッセージを作成するとき、Djangoを使用render_to_stringしてメッセージを文字列にパッケージ化し、data辞書に保存します。その後、myを使用してrender_to_json適切な応答を返します。

def my_custom_view(request)
    # ...  your view code
    data = {
        'msg': render_to_string('messages.html', {}, RequestContext(request)),
    }
    return render_to_json(request, data)

次に、jQueryコールバック関数で、オブジェクトに属性がある$.post(...)かどうかを確認し、必要に応じてjQueryトランジションを使用して、のコンテンツを必要なDOMに挿入します。私のテンプレートには、メッセージのコンテナが含まれています。responsemsgresponse.msgbase.html<ul>

<ul id="popup-messages-content">
    {% include 'messages.html' %}
</ul>

上記にはmessages.html、実際のページ読み込み時にメッセージを表示する場合(AJAX以外のリクエスト)の場合が含まれていることに注意してください。メッセージがない場合は空白ですが、<ul>AJAXで受信したメッセージをにプッシュすることはできます。

$.post(...)最後の部分は、メッセージを表示するためにコールバックで使用するJavascript関数(jQueryが必要)です。

function showPopupMessage(content) {
    var elMessages = $('#popup-messages-content');
    if (elMessages.length && content) {
        elMessages.html(content);
    }
}
于 2012-11-06T18:52:11.490 に答える
10

いつものようにメッセージを作成し、応答を送信する前に、メッセージをdictのリストに入れます。

django_messages = []

for message in messages.get_messages(request):
    django_messages.append({
        "level": message.level,
        "message": message.message,
        "extra_tags": message.tags,
})

次に、データとメッセージを追加してシリアル化します。例:

data = {}
data['success'] = success
data['messages'] = django_messages

return HttpResponse(simplejson.dumps(data), content_type="application/json")

最後にあなたのajaxで:

success: function(data){
                                success = data.success;
                                update_messages(data.messages);
                                if (success){
                                    ...                                                                             
                                }
                            },

そしてupdate_messages関数:

function update_messages(messages){
$("#div_messages").html("");
$.each(messages, function (i, m) {
                $("#div_messages").append("<div class='alert alert-"+m.level+"''>"+m.message+"</div>");
            });
    

}

それは完璧に機能し、実装するのは非常に簡単であることがわかりました

于 2014-05-22T13:55:41.847 に答える
4

これが簡単なアイデアです。

layout.htmlにメッセージのプレースホルダーを追加します。これにより、javascriptに新しいメッセージを追加できます。

<div id="messages">
{% for message in messages %}
    <div id="notice" align="center">
        {{ message }}
    </div>
{% endfor %}
</div>

それ以外の:

{% for message in messages %}
    <div id="notice" align="center">
        {{ message }}
    </div>
{% endfor %}

add.htmlに、次のような別のものを追加します。

{% if messages %}
<ul class="hidden-messages" style="display:none">
    {% for message in messages %}
        <div id="notice" align="center">
            {{ message }}
        </div>
    {% endfor %}
</ul>
{% endif %}

そして、ajaxFormは次のようになります。

$('#your_form_id').ajaxForm({
    success: function(responseText) {
        var newMessages = $(responseText).find('.hidden-messages').html();
        $('#messages').append(newMessages);
    },
});
于 2012-11-06T18:37:41.667 に答える
1

テンプレートで

<div id="ajax_message">
    {% if messages %}
        {% for message in messages %}
            <div class="alert alert-{{ message.tags }}  fade show">
                {{ message|safe }}
            </div>
        {% endfor %}
    {% endif %}
</div>

ajax_send開始関数の後

$("#ajax_message").load("this_url #ajax_message");

また

function alert_message() {
    var pathname = window.location.pathname;
    $("#ajax_message").load(pathname+" #ajax_message");
}
于 2020-11-08T19:20:09.553 に答える
0

django-bootstrap5 libを使用するときにこれを行う方法:

カスタムmessages.htmlテンプレートを返すだけのメッセージビューに対してAJAXgetリクエストを作成します。

さて、私はこの問題に関してこれまでに行われた作業のいくつかをレビューし、おそらく上記の複製であるきちんとした解決策を思いつきました、しかし私の投稿は私がコーダーのためにこの問題を具体的に解決しているという点でそれらとは異なりますdjango-bootstrap5を使用します。したがって、それがあなたである場合は、さらに読んでください。これで問題が解決する可能性があります。

これは、一部のIDE<DefaultApp>がDjangoプロジェクト用に作成するデフォルトのアプリです。私の現在のプロジェクトはと呼ばれAbstractSpacecraft、サブフォルダーも呼び出されます。このサブフォルダーには、デフォルトのアプリがAbstractSpacecraft含まれています。settings.py

<DjangoProject>/<DefaultApp>/javascript_tools.js

window.messages_tag_id = "#django-messages-div";
window.messages_url = null;

function load_html_from_url(url, elem) {
    $.get(url, function(data, status) {
        elem.html(data);
    });   
}

function display_django_messages() {
    messagesDiv = $(window.messages_tag_id);
    messagesDiv.empty();
    load_html_from_url(window.messages_url, messagesDiv);
}

function post_string_to_url(data, url)
{
    $.ajax({
        type: 'POST',
        url: url,
        data: data,
        success: function(data, status, xhr) {         // Function( Anything data, String textStatus, jqXHR jqXHR )
            if ('msg' in data) {
                const msg = data['msg'];
                console.log(msg);
                display_django_messages();
            }
        },
        error : function(xhr, errmsg, err) {
            // Provide a bit more info about the error to the console:
            if (errmsg) {
                console.log('ERROR: ' + errmsg);
                display_django_messages();
            }
            console.log(xhr.status + ": " + xhr.responseText);             
        }
    });
}

function csrf_safe_method(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

function setup_ajax_csrf_token(csrf_token) { 
    // BUGFIX.  This took hours to get to work!  
    // And remember the csrf_token line at the top of template
    window.csrf_token = csrf_token;
    
    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!csrf_safe_method(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrf_token);
            }
        }
    });
}

`

<DjangoProject>/templates/<AppName>/your_template.html(関連部品のみ):

<script>
    $(document).ready(function()
    {
        // Remember to call this!
        setup_ajax_csrf_token("{{ csrf_token }}");   

        let ui = window.ui;
            
        $("#diagram-name-form").submit((event) => {
            event.preventDefault();
            const data = {
                "diagram name" : $("#diagram-name-input").val(),
                "diagram id" : "{{ diagram_id }}",
            };
            const set_name_url = "{% url 'set_model_string' Model='Diagram' field='name'%}";
            
            post_string_to_url(data, set_name_url, "{% url 'messages' %}");
        });
    });        
    
</script>

 .....

<div class="form-outline">
    <form class="row row-cols-lg-auto g-3 align-items-center" method="post"
        id="diagram-name-form">
        {% csrf_token %}
    
        <input type="text" id="diagram-name-input" class="form-control" placeholder="Diagram name?" />
    </form>
</div>

<DjangoProject>/templates/<DefaultApp>/messages.html

{% load django_bootstrap5 %}

{% autoescape off %}{% bootstrap_messages %}{% endautoescape %} 

<DjangoProject/<DefaultApp>/views.py

from django.shortcuts import render
from django.views.generic.base import TemplateView, View

class MessagesView(View):
    template_name = 'AbstractSpacecraft/messages.html'

    def get(self, request, *args, **kwargs):
        return render(request, self.template_name)

<DjangoProject>/<DefaultApp>/base.html

{% block bootstrap5_content %}
  {% block as_navbar %}  <!-- as = AbstractSpacecraft -->
   ....
  {% endblock %}
  
  <div class="container-fluid">
      <div class="row">
          <div class="col">
              <div class="row" id="django-messages-div">
                {% autoescape off %}{% bootstrap_messages %}{% endautoescape %}              
              </div>              
              {% block content %}{% endblock %}                
          </div>
      </div>
  </div>
{% endblock %}
....

基本的に、ajax POSTリクエストからOKを受け取った後、ajax GETリクエストを実行します。すべてが機能しているので、機能する可能性がありmessagesDiv.load(url)ますが、Chrome DevToolsの[ネットワーク]タブを表示し、トラフィックアナライザーでは、すべてが機能しているときにPOSTリクエストとそれに続くGETリクエストが表示されます。

ajax GETは単純にmessages.htmlテンプレートを取得し、それをメッセージについて新たに知ったもので埋めます。messageDivただし、メッセージがGUIに積み重ならないように、最初のメッセージを必ずクリアしてください。

于 2021-10-10T09:14:10.373 に答える