【问题标题】:Reverse for 'edit_post' with arguments '('',)' not found. 1 pattern(s) tried: ['edit_post/(?P<post_id>\\d+)/$']未找到带有参数 '('',)' 的 'edit_post' 的反向操作。尝试了 1 种模式:['edit_post/(?P<post_id>\\d+)/$']
【发布时间】:2018-11-21 11:28:17
【问题描述】:

我正在阅读 Django 教程,并在尝试在我的博客应用程序中编辑帖子时收到此错误。我使用 Django 版本:2.0.6 和 Python 版本:3.6.5。

models.py

from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=100)
    text = models.TextField()

    def __str__(self):
        return self.title

urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^new_post/', views.new_post, name='new_post'),
    url(r'^edit_post/(?P<post_id>\d+)/$', views.edit_post, name='edit_post'),
]

导致第 3 行错误的模板 - edit_post.html。错误消息突出显示 {% url 'edit_post' post.id %}

{% block content %}
  <form action="{% url 'edit_post' post.id %}" method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <button name="submit">save changes</button>
  </form>
{% endblock content %}

带有指向 edit_post.html 链接的模板 (index.html)

{% block content %}
  <form action="{% url 'new_post' %}" method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <button name="submit">Make a new post</button>
  </form>
  <ul>
    {% for post in posts %}
      <li>
        {{ post.id }} - {{ post.title }}
        <p>{{ post.text }}</p>
        <a href="{% url 'edit_post' post.id %}">edit post</a>
      </li>
    {% empty %}
      <li>No posts have been added yet.</li>
    {% endfor %}
  </ul>
{% endblock content %}

views.py

def edit_post(request, post_id):
    post = BlogPost.objects.get(id=post_id)
    text = post.text
    title = post.title
    if request.method != 'POST':
        form = BlogForm(instance=post)
    else:
        form = BlogForm(instance=post, data=request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('index'))
    context = {'title': title, 'text': text, 'form': form}
    return render(request, 'blog/edit_post.html', context)

forms.py

from django import forms
from .models import BlogPost

class BlogForm(forms.ModelForm):
    class Meta:
        model = BlogPost
        fields = ['title', 'text']

问题

当我点击索引页面上的 edit post 链接时,我收到上述错误。使用这种方法创建新帖子完美无缺,但编辑却不行。 我被这个问题困住了,不知道出了什么问题。

我的尝试

  1. 我已尝试将 django.conf.urls.url 替换为 django.urls.path 和相应的模式。
  2. 我已更改按钮的链接。
  3. 我试过了
  4. 我已经阅读了 StackOverflow 上的 What is a NoReverseMatch error, and how do I fix it? 以及我能找到的尽可能多的主题。

感谢任何帮助。提前谢谢!

【问题讨论】:

    标签: python django


    【解决方案1】:

    在您的blog/edit_post.html 中使用post.id

    <form action="{% url 'edit_post' post.id %}" method='post'>
        ...
    </form>
    

    但在views.py 中,您不会将post 变量传递给context 变量

    def edit_post(request, post_id):
        post = BlogPost.objects.get(id=post_id)
        ...
    
        context = {
                  'title': title, 
                  'text': text, 
                  'form': form,
                  'post': post # here
                  }
        return render(request, 'blog/edit_post.html', context)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-26
      • 2023-03-28
      • 2021-04-24
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多