首页 > 解决方案 > django 异常:未找到带有关键字参数“{'pk':''}' 的“comment_new”的反向

问题描述

我对 python/Django 很陌生,我目前想实现我的每一篇博文都可以有评论。但我不明白这一点。我以与我的帖子模型相同的方式创建所有内容期望我

Exception Type: NoReverseMatch
Exception Value: Reverse for 'comment_new' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['comment/new/$']

网址.py:

from django.conf.urls import url
from django.contrib import admin

from . import views

urlpatterns = [
    url(r'^admin/', (admin.site.urls)),
    url(r'^$', views.post_list, name='post_list'),
    url(r'^post/(?P<pk>\d+)/$', views.post_detail, name='post_detail'),
    url(r'^post/new/$', views.post_new, name='post_new'),
    url(r'^post/(?P<pk>\d+)/edit/$', views.post_edit, name='post_edit'),
    url(r'^comment/new/$', views.comment_new, name='comment_new'),
    url(r'^comment/(?P<pk>\d+)/edit/$', views.comment_edit, name='comment_edit'),
]

视图.py:

from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone
from .models import Post
from .models import Comment
from .forms import PostForm, CommentForm


def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'quickblog/post_list.html', {'posts': posts})


def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'quickblog/post_detail.html', {'post': post})


def post_new(request):
    form = PostForm()
    return render(request, 'quickblog/post_edit.html', {'form': form})


def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'quickblog/post_new.html', {'form': form})


def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'quickblog/post_edit.html', {'form': form})


def comment_edit(request, pk):
    comment = get_object_or_404(Comment, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=comment)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.author = request.user
            comment.published_date = timezone.now()
            comment.save()
            return redirect('post_detail', pk=comment.pk)
    else:
        form = PostForm(instance=comment)
    return render(request, 'quickblog/comment_edit.html', {'form': form})


def comment_new(request):
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.author = request.user
            comment.published_date = timezone.now()
            comment.save()
            return redirect('post_detail', pk=comment.pk)
    else:
        form = CommentForm()
    return render(request, 'quickblog/comment_new.html', {'form': form})

post_detail.html:

{% extends 'quickblog/base.html' %}

{% block content %}
    <div class="post">

        <h1>{{ post.title }}</h1>
        <p>{{ post.text|linebreaksbr }}</p>

        {% if post.published_date %}
            <div class="date">
                <a>Posted at: {{ post.published_date }}</a>
            </div>
        {% endif %}

    {% if user.is_authenticated %}
        <a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span>Edit this Post</a>
        <a class="btn btn-default" href="{% url 'comment_new' pk=comment.pk %}"><span class="glyphicon glyphicon-pencil"></span>Add Comment</a>
    {% endif %}

    </div>
{% endblock %}

{% block comment %}
    <div class="comment">

        <p>{{ comment.text|linebreaksbr }}</p>

        {% if comment.published_date %}
            <div class="date">
                <a>Published at: {{ comment.published_date }}</a>
            </div>
        {% endif %}

    {% if user.is_authenticated %}
        <a class="btn btn-default" href="{% url 'comment_new' pk=comment.pk %}"><span class="glyphicon glyphicon-plus"></span>Add Comment</a>
    {% endif %}

    </div>
{% endblock %}

模型.py

#Post Model
class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

#Comment(s) of Post Model
class Comment(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    post=models.ForeignKey(Post, on_delete=models.CASCADE)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

如果有人能给我一个很好的提示,我会很高兴的。谢谢,祝大家周末愉快:)

标签: pythondjangoprimary-key

解决方案


以下不正确

{% url 'comment_new' pk=comment.pk %}

您的 url 模式url(r'^comment/new/$', views.comment_new, name='comment_new'),显示没有pkas 参数,因此您的 url 调用应该是

{% url 'comment_new' %}

在您的模板中:

<a class="btn btn-default" href="{% url 'comment_new' %}"><span class="glyphicon glyphicon-plus"></span>Add Comment</a>

推荐阅读