Не удается получить DeleteView сообщения в проекте социальной сети - PullRequest
0 голосов
/ 17 апреля 2020

Я создаю простую социальную сеть в django.

В «доме» моей социальной сети у меня есть список всех сообщений, опубликованных всеми пользователями, с указанием автора и даты публикации. Под каждым сообщением зарегистрированного пользователя появляется кнопка «Удалить». Если пользователь щелкает по нему, он должен вернуть определенный c вид этого сообщения с сообщением типа "действительно ли вы sh хотите удалить это сообщение?"

Однако, когда я нажимаю на это, код возвращает эту ошибку:

NoReverseMatch в / posts / delete / 7 /

Обратное для 'single' без аргументов не найдено. Попробован 1 шаблон (ов): ['posts / by / (? P [- \ w] +) / (? P \ d +) / $']

Почему он говорит, что не может получить обратное для 'single' без аргументов, в то время как в шаблоне кнопка удаления имеет ссылку на функцию просмотра 'delete'?

Вот мой urls.py, внутри urlpatterns:

url(r'^$', 
views.PostList.as_view(), 
name='all'),

url(r'new/$', 
views.CreatePost.as_view(), 
name='create'),

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:

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)

Вот мой шаблон, в котором появляется кнопка удаления:

    {% if user.is_authenticated and post.user.username == user.username %}

        <a href="{% url 'posts:delete'  pk=post.pk %}" title="delete" class="btn btn-simple">
            <span class="glyphicon glyphicon-remove text-danger" aria-hidden="true"></span>
            <span class="text-danger icon-label">Delete</span>
        </a>

   {% endif %}

EDIT:

Вот мой шаблон, показывающий сообщение и спрашивающий пользователя, действительно ли он / она хочет удалить его:

<h3>Do you want to delete this post?</h3>

<div class="posts">
    {% include "posts/_post.html" with post=object hide_delete=True %}
</div>

<form class="POST">
    {% csrf_token %}
    <input type="submit" value="Confirm Delete" class="btn btn-danger btn-large">
    <a href="{% url 'posts:single' username=user.username pk=object.pk %}"
    class="btn btn-simple btn-large btn-default">Cancel</a>
</form>

Модель User по умолчанию django models.User

Примечание. Ранее я сталкивался с подобной ошибкой, связанной с использованием выражений регулярных выражений. Более подробную информацию можно найти в этом другом вопросе .

1 Ответ

0 голосов
/ 17 апреля 2020

Я искал ошибку в части шаблона, показывающей кнопку удаления, в то время как она лежала в шаблоне, спрашивая пользователя, хочет ли он / она удалить сообщение.

В фрагменте кода:

<h3>Do you want to delete this post?</h3>

<div class="posts">
    {% include "posts/_post.html" with post=object hide_delete=True %}
</div>

<form class="POST">
    {% csrf_token %}
    <input type="submit" value="Confirm Delete" class="btn btn-danger btn-large">
    <a href="{% url 'posts:single' %} username=user.username pk=object.pk %}"
    class="btn btn-simple btn-large btn-default">Cancel</a>
</form>

Я заменил

<a href="{% url 'posts:single' %} username=user.username pk=object.pk %}"

на:

<a href="{% url 'posts:delete' pk=post.pk %}"

и теперь он, наконец, переносит меня в представление подтверждения удаления сообщения

...