Я пытаюсь реализовать мягкое удаление в django

#django #django-models

#django #django-модели

Вопрос:

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

Нет никакого соответствия в / admin / trip-issue-report/

Обратный для ‘soft-delete-trip-issue’ с аргументами ‘(3,)’ не найден. Попробовано 1 шаблон (ы): [‘admin / soft -delete -trip -issue/$’]

Мой код:

models.py

 class TripIssue(models.Model):
    trip = models.ForeignKey(Trip, on_delete=models.CASCADE)
    issue = models.ForeignKey(Issue, on_delete=models.CASCADE)
    isSolved = models.BooleanField(blank=False, default=False)
    is_deleted = models.BooleanField(default=False)
    deleted_at = models.DateTimeField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def soft_delete(self):
        self.is_deleted = True
        self.deleted_at = timezone.now()
        self.save()
  

views.py

 class TripIssueSoftDelete(DeleteView):
    model = TripIssue
    success_url = reverse_lazy('trip-issue-report')
    template_name = 'trip_issue.html'

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        self.object.soft_delete()
        return HttpResponseRedirect(self.get_success_url()) 
  

urls.py

path('soft-delete-trip-issue/', views.TripIssueSoftDelete, name="soft-delete-trip-issue"),

trip_issue.html шаблон

           {% for trip_issue in trip_issues %}
                <tr>
                  <td>{{trip_issue.trip}}</td>
                  <td>{{trip_issue.issue}}</td>
                  <td>{{trip_issue.isSolved}}</td>
                  <td>{{trip_issue.updated_at}}</td>
                    <td><a href="{% url 'dashboard:soft-delete-trip-issue' trip_issue.id %}"><i class="fas fa-minus-circle"></i></a></td>
                </tr>
                {% endfor %}
              </tbody>
  

Поэтому мне нужна ваша помощь, чтобы устранить проблему и успешно реализовать мягкое удаление.

Заранее спасибо.

Счастливого кодирования 🙂

Ответ №1:

Отображается ошибка Reverse for 'soft-delete-trip-issue' with arguments '(3,)' not found. 1 pattern(s) tried: ['admin/soft-delete-trip-issue/$'] . Читайте внимательно: это точно указывает, в чем проблема.

Ваша запись path() в urls.py не позволяет передавать аргумент:

path('soft-delete-trip-issue/', views.TripIssueSoftDelete, name="soft-delete-trip-issue"),

Измените, например,:

path('soft-delete-trip-issue/<int:pk>', views.TripIssueSoftDelete, name="soft-delete-trip-issue"),

Смотрите https://docs.djangoproject.com/en/3.1/topics/http/urls /.

Комментарии:

1.Спасибо за ваш ответ. Я внес изменения в соответствии с вашим предложением, но теперь получаю другую ошибку: TypeError at /admin/soft-delete-trip-issue/3 __init__() takes 1 positional argument but 2 were given Еще раз спасибо.

Ответ №2:

Вот решение, которое я сделал:

urls.py

обновил URL < str:pk > и viewset [поскольку это представление на основе класса] с помощью .as_view()

path('soft-delete-trip-issue/<str:pk>/', views.TripIssueSoftDelete.as_view(), name="soft-delete-trip-issue"),

Дополнительные советы: если вы получаете эту ошибку __init__() takes 1 positional argument but 2 were given , убедитесь, что ваш декоратор в представлении работает, или попробуйте это исправить.

Счастливого кодирования 🙂

Ответ №3:

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