【问题标题】:'add_comment_to_post' is not a valid view function or pattern name'add_comment_to_post' 不是有效的视图函数或模式名称
【发布时间】:2020-08-26 10:24:08
【问题描述】:

我是 Python 新手。在运行 post.html 文件时向我的 Django 项目添加注释选项时出现此错误:

django.urls.exceptions.NoReverseMatch:找不到“add_comment_to_post”的反向。 'add_comment_to_post' 不是有效的视图函数或模式名称。

浏览器页面截图是

[在此处输入图片描述][1]

html代码是:

<div class="media">
    <h3 class="mr-5"><a href="{% url 'posts:for_user' username=post.user.username %}">@{{ post.user.username }}</a></h3>

    <div class="media-body">
        <strong>{{ post.user.username }}</strong>
        <h5>{{ post.message_html|safe }}</h5>
            <time class="time"><a href="{% url 'posts:single' username=post.user.username pk=post.pk %}">{{ post.created_at }}</a></time>
            {% if post.group %}
            <span class="group-name">in <a href="#">{{ post.group.name }}</a></span>
            {% endif %}
        </h5>

        <div class="media-footer">
            {% if user.is_authenticated and post.user == user and not hide_delete %}
                <a href="{% url 'posts:delete' pk=post.pk %}" title="delete" class="btn btn-simple">
                    <span class="fa fa-remove text-danger" aria-hidden="true"></span>
                    <span class="text-danger icon-label">Delete</span>
                </a>
            {% endif %}
        </div>
    </div>
</div>
<hr>
<a class="btn btn-default" href="{% url 'add_comment_to_post' pk=post.pk %}">Add comment</a>

{% for comment in post.comments.all %}
<a class="btn btn-default" href="{% url 'add_comment_to_post.html' pk=post.pk %}">Add comment</a>
    <div class="comment">
        <div class="date">{{ comment.created_date }}</div>
        <strong>{{ comment.author }}</strong>
        <p>{{ comment.text|linebreaks }}</p>
    </div>
{% empty %}
    <p>No comments here yet :(</p>
{% endfor %}

urls.py 文件如下所示

from django.urls import path
from . import views

app_name='posts'

urlpatterns = [
    path('', views.PostList.as_view(), name="all"),
    path("new/", views.CreatePost.as_view(), name="create"),
    path("by/<username>/",views.UserPosts.as_view(),name="for_user"),
    path("by/<username>/<int:pk>/",views.PostDetail.as_view(),name="single"),
    path("delete/<int:pk>/",views.DeletePost.as_view(),name="delete"),
    path('post/<int:pk>/comment/', views.add_comment_to_post, name='add_comment_to_post'),
]

views.py 文件如下所示

from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.http import Http404
from django.views import generic
from django.contrib.auth.decorators import login_required
from .forms import PostForm, CommentForm
from .models import Post, Comment
# pip install django-braces
from braces.views import SelectRelatedMixin

from . import forms
from . import models

from django.contrib.auth import get_user_model
User = get_user_model()


class PostList(SelectRelatedMixin, generic.ListView):
    model = models.Post
    select_related = ("user", "group")


class UserPosts(generic.ListView):
    model = models.Post
    template_name = "posts/user_post_list.html"

    def get_queryset(self):
        try:
            self.post_user = User.objects.prefetch_related("posts").get(
                username__iexact=self.kwargs.get("username")
            )
        except User.DoesNotExist:
            raise Http404
        else:
            return self.post_user.posts.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["post_user"] = self.post_user
        return context


class PostDetail(SelectRelatedMixin, generic.DetailView):
    model = models.Post
    select_related = ("user", "group")

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(
            user__username__iexact=self.kwargs.get("username")
        )


class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    # form_class = forms.PostForm
    fields = ('message','group')
    model = models.Post

    # def get_form_kwargs(self):
    #     kwargs = super().get_form_kwargs()
    #     kwargs.update({"user": self.request.user})
    #     return kwargs

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)


class DeletePost(LoginRequiredMixin, SelectRelatedMixin, generic.DeleteView):
    model = models.Post
    select_related = ("user", "group")
    success_url = reverse_lazy("posts:all")

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(user_id=self.request.user.id)

    def delete(self, *args, **kwargs):
        messages.success(self.request, "Post Deleted")
        return super().delete(*args, **kwargs)




def add_comment_to_post(request, pk):
        post = get_object_or_404(Post, pk=pk)
        if request.method == "POST":
            form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.save()
            return redirect('post_detail', pk=post.pk)
        else:
            form = CommentForm()
            return render(request, 'posts/add_comment_to_post.html', {'form': form})

【问题讨论】:

    标签: python django django-rest-framework django-templates python-requests


    【解决方案1】:
    <a class="btn btn-default" href="{% url 'posts:add_comment_to_post' pk=post.pk %}">
    

    尝试添加您的应用名称,因为我可以看到您的应用名称是帖子,因此您在使用 add_comment_to_post 的地方添加应用名称为“{% url 'posts:add_comment_to_post' pk=post.pk %}”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-29
      • 2020-03-13
      • 2020-05-31
      • 2019-05-09
      • 2018-11-19
      • 2018-01-25
      • 2020-12-01
      • 2019-06-27
      相关资源
      最近更新 更多