python - 如何使用 AJAX 使用相同的 html 模板(使用 Python 和 Django)创建和编辑新帖子?

标签 python django ajax

我正在尝试切换到使用 AJAX 保存表单,而不仅仅是 Python/Django(我是一个绝对的新手,所以请原谅我的白痴)。这是我想要实现的目标:

What I'm trying to achieve

urls.py:

from django.urls import path 
from . import views

urlpatterns = [
    path('', views.blurb_new, name='blurb_new'),
    path('blurb/new/', views.blurb_new, name='blurb_new'),
    path('blurb/<int:pk>/edit/', views.blurb_edit, name='blurb_edit'),
]

views.py(相关部分):

@login_required
def blurb_new(request):
    if request.method == "POST":
        form = BlurbForm(request.POST)
        if form.is_valid():
            blurb = form.save(commit=False)
            blurb.author = request.user
            blurb.save()
            return redirect('blurb_edit', pk=blurb.pk)
    else:
        form = BlurbForm()
    return render(request, 'mysite/blurb_edit.html', {'form': form})

@login_required
def blurb_edit(request, pk):
    blurb = get_object_or_404(Blurb, pk=pk)
    if request.method == "POST":
        form = BlurbForm(request.POST, instance=blurb)
        if form.is_valid():
            blurb = form.save(commit=False)
            blurb.author = request.user
            blurb.last_edited_date = timezone.now()
            blurb.save()
            return redirect('blurb_edit', pk=blurb.pk)
    else:
        form = BlurbForm(instance=blurb)
    return render(request, 'mysite/blurb_edit.html', {'form': form, 'blurb': blurb})

blurb_edit.html(相关部分):

<form id="myform" method="POST" class="blurb-form">{% csrf_token %}
   <input id="blurb-name" name="title"
        {% if form.title.value != None %}value="{{ form.title.value }}"{% endif %} 
   />
   <textarea name="text" id="my-textarea">
        {% if form.text.value != None %}
            {{ form.text.value }}
        {% else %}
            Type your blurb here.
        {% endif %}
    </textarea>
    <button type="submit">Save</button>
</form>

在我使用 AJAX 之前,views.py 完全完成了它的工作(除了那个讨厌的、不需要的页面刷新)。

因为我讨厌每次保存简介编辑时页面刷新的方式,所以我决定改用 AJAX。

这是我添加的一些 AJAX。它适用于编辑简介,但不适用于创建新的简介 - 可能是因为新的简介还没有 pk。我不知道如何解决这个问题。

blurb_edit.html 中的 AJAX:

<script type="text/javascript">
    $(document).on('submit', '#myform', function(e) { 
        e.preventDefault();
        $.ajax({
            type: 'POST',
            url:'{% url 'blurb_edit' pk=blurb.pk %}', // <--- THIS "pk" isn't working if it's a new blurb
            data:{
                title:$('#blurb-name').val(),
                text:$('#my-textarea').val(),
                csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
            },

            success:function() {
                alert("yay! it worked.")
            }

        })

    });
</script>

这样我就可以很好地编辑简介。

这是我加载主页以创建新简介时遇到的错误:

NoReverseMatch at /
Reverse for 'blurb_edit' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['blurb/(?P<pk>[0-9]+)/edit/$']

如何解决这个“pk”问题,以便 AJAX 可以像views.py 一样工作?

再次,请原谅我的无知(可能还有糟糕的代码),因为我对这些事情很陌生,并试图理解它。谢谢你! :)

最佳答案

<script type="text/javascript">
$(document).on('submit', '#myform', function(e) { 
    e.preventDefault();
    $.ajax({
        type: 'POST',
        url:'blurb_edit/{{blurb.pk}}/edit/', // check this version of url
        data:{
            title:$('#blurb-name').val(),
            text:$('#my-textarea').val(),
            csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
        },

        success:function() {
            alert("yay! it worked.")
        }

    })

});

关于python - 如何使用 AJAX 使用相同的 html 模板(使用 Python 和 Django)创建和编辑新帖子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59003393/

相关文章:

python - 带有 djoser 的 django 上的 webauthn 签名问题

php - 当另一个ajax调用更改div y的内容时,如何自动更改div x(使用ajax)的内容?

python - 如何比较两个或多个音频文件并获取音频不同的时间码?

python:涉及幂级数的问题的效率

python - 高效的矩阵计算算法

javascript - NodeJs : can't write a file

javascript - 异步HTTP(ajax)请求在脚本标签中有效,但在js文件中无效

python - 从 pybind11 包装特征返回数组列表或元组

python - 如何将 Django 和 .net core 项目连接为单个应用程序?

python - 尝试使用 django-embed-video 将 youtube 视频列表显示到 django 模板中