#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, чтобы восстановить его, написать отдельную функцию для реализации того же самого.
- Я также использовал тот же подход, что и упоминал, и у меня он довольно хорошо работает. Вы также можете попробовать это.