Django - NoReverseMatch в / posts / new / in / group-1 / - PullRequest
0 голосов
/ 10 июля 2020

На моем форуме нравится сайт. Мне нужна была функция, при которой, если пользователь является частью группы, только тогда у пользователя есть возможность публиковать сообщения в группе. Теперь я пытаюсь передать групповой заголовок в URL-адресе при нажатии кнопки «POST». Но URL-адрес по какой-то причине не совпадает. Существуют два разных приложения для групп и сообщений соответственно.

  1. Это «group_detail. html» Кнопка POST доступна для нажатия после того, как пользователь присоединился группа (строка номер 10) -
{% extends "groups/group_base.html" %}

{% block content %}

<h1>{{group.name}}</h1>
<h2> Member Count: {{group.members.count}}</h2>

  <div class="content">


                {% if user in group.members.all %}
                    <a href="{% url 'groups:leave' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning"><span class="glyphicon glyphicon-remove-circle"></span> Leave</a>
    //line 10          <a href="{% url 'posts:create1' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning" ><span class="glyphicon glyphicon-ok-circle"></span>Post</a></li>
                    {% else %}
                    <a href="{% url 'groups:join' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning"><span class="glyphicon glyphicon-ok-circle"></span> Join</a>
                {% endif %}

</div>
Это urls.py приложения Post
from django.conf.urls import url
from django.urls import path
from . import views

app_name='posts'

urlpatterns = [
    url(r"^$", views.PostList.as_view(), name="all"),
    url(r"new/in/(?P<slug>[-\w]+)/$", views.CreatePost.as_view(), name="create1"),
    url(r"by/(?P<username>[-\w]+)/$",views.UserPosts.as_view(),name="for_user"),
    url(r"by/(?P<username>[-\w]+)/(?P<pk>\d+)/$",views.PostDetail.as_view(),name="single"),
    url(r"delete/(?P<pk>\d+)/$",views.DeletePost.as_view(),name="delete"),
]

Это views.py приложения Post
# from django.shortcuts import render

# # Create your views here.
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.shortcuts import get_object_or_404
from groups.models import Group

from braces.views import SelectRelatedMixin

from . import forms
from . import models

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

class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    # form_class = forms.PostForm
    fields = ('message',)
    model = models.Post
    def get(self, request, *args, **kwargs):
        group = get_object_or_404(Group,slug=self.kwargs.get("slug"))

        # try:
        #     GroupMember.objects.create(user=self.request.user,group=group)

        # except IntegrityError:
        #     messages.warning(self.request,("Warning, already a member of {}".format(group.name)))

        # else:
        #     messages.success(self.request,"You are now a member of the {} group.".format(group.name))

        return super().get(request, *args, **kwargs)


    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.group=group
        self.object.save()
        return super().form_valid(form)
Это post_form. html т.е. шаблон формы
{% extends "posts/post_base.html" %}

{% load bootstrap3 %}

{% block content %}
<h4>Create New Post</h4>
//line 7 <form method="POST" action="{% url 'posts:create1' slug=group.slug %}" id="postForm">
    {% csrf_token %}
    {% bootstrap_form form %}
    <input type="submit" value="Post" class="btn btn-primary btn-large">
</form>
{% endblock %}

Я получаю следующую ошибку при нажатии кнопки публикации - изображение ошибки

1 Ответ

0 голосов
/ 12 июля 2020

Ошибка исходила из строки 7 приложения post 'post_form. html', как указано в комментариях.

измените ее с-

<form method="POST" action="{% url 'posts:create1' slug=group.slug %}" id="postForm">

на-

<form method="POST" action="" id="postForm">

Я проверил это, распечатав его на веб-странице, group.slug становится нулевым в этой форме, даже если url показывает правильный slug и, следовательно, ничего не было напечатано в {{group.slug}} на веб-странице.

Это решает указанную выше ошибку.

Я также изменил файл views.p приложения публикации для представления createPost, чтобы моя функция работала. В этом процессе я везде изменил "slug" на "pk", чтобы указать группу с ее первичным ключом.

Итак, теперь все вышеперечисленные файлы выглядят следующим образом (функция создания сообщения работает [теперь все в порядке) -

  1. Это "group_detail. html" Кнопка POST доступна для нажатия после того, как пользователь присоединился к группе (строка номер 10) -
{% extends "groups/group_base.html" %}

{% block content %}

<h1>{{group.name}}</h1>
<h2> Member Count: {{group.members.count}}</h2>

  <div class="content">


                {% if user in group.members.all %}
                    <a href="{% url 'groups:leave' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning"><span class="glyphicon glyphicon-remove-circle"></span> Leave</a>
   //line 10        <a href="{% url 'posts:create1' pk=group.pk %}" class="btn btn-lg btn-fill btn-warning" ><span class="glyphicon glyphicon-ok-circle"></span>Post</a></li>
                    {% else %}
                    <a href="{% url 'groups:join' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning"><span class="glyphicon glyphicon-ok-circle"></span> Join</a>
                {% endif %}

</div>
Это urls.py приложения Post
from django.conf.urls import url
from django.urls import path
from . import views

app_name='posts'

urlpatterns = [
    url(r"^$", views.PostList.as_view(), name="all"),
    url(r"new/in/(?P<pk>\d+)/$", views.CreatePost.as_view(), name="create1"),
    url(r"by/(?P<username>[-\w]+)/$",views.UserPosts.as_view(),name="for_user"),
    url(r"by/(?P<username>[-\w]+)/(?P<pk>\d+)/$",views.PostDetail.as_view(),name="single"),
    url(r"delete/(?P<pk>\d+)/$",views.DeletePost.as_view(),name="delete"),
]

Это приложение 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.shortcuts import get_object_or_404
from groups.models import Group

from braces.views import SelectRelatedMixin

from . import forms
from . import models

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

class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    fields = ('message',)
    model = models.Post

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.group=get_object_or_404(Group,pk=self.kwargs.get('pk'))
        self.object.save()
        return super().form_valid(form)
Это post_form приложения для публикации. html т.е. шаблон формы -
{% extends "posts/post_base.html" %}

{% load bootstrap3 %}

{% block content %}
<h4>Create New Post</h4>
//line 7  <form method="POST" action="" id="postForm">
    {% csrf_token %}
    {% bootstrap_form form %}
    <input type="submit" value="Post" class="btn btn-primary btn-large">
</form>
{% endblock %}

...