Как я могу пропустить pk в url при перенаправлении на другой url с помощью общего RedirectView в Django?

Я пытаюсь удалить запись после отображения ее с помощью DetailView и повторного перенаправления на страницу списка.

view.py

...

class DailyRecordDeleteConformationView(RequiredBasicDetailsAndContextMixin, DetailView):
    model = DailyRecord
    obj_not_found_redirect = reverse_lazy('business:add_daily_records')
    template_name = 'business/daily_records_detail.html'
    context_object_name = 'record'

    def get_object(self):
        detail = self.model.custom_obj.get_single(self)
        return detail


class DailyRecordDeleteView(RequiredBasicDetailsMixin, RedirectView):
    pattern_name = 'business:daily_records'

    def get_redirect_url(self, *args, **kwargs):
        # Delete the record
        return super().get_redirect_url(*args, **kwargs)

...

urls.py

...
    path('daily-records/', DailyRecordView.as_view(), name='daily_records'),
    path('daily-records/<int:pk>/', DailyRecordDeleteConformationView.as_view(), name='daily_record_detail'),
    path('daily-records/<int:pk>/delete/', DailyRecordDeleteView.as_view(), name='daily_record_delete'),

...

Здесь я получаю следующую ошибку при нажатии на кнопку удаления в детальном представлении

NoReverseMatch at /business/daily-records/7/delete/

Reverse for 'daily_records' with keyword arguments '{'pk': 7}' not found. 1 pattern(s) tried: ['business/daily\\-records/\\Z']

Я новичок в представлениях на основе классов, и до сих пор не могу понять, как перенаправить на url, который не имеет параметра pk.

Я пытался найти какую-нибудь переменную для RedirectView или что-то, что может пропустить pk текущего url при перенаправлении на другой url.

Спасибо.

Когда вы вызываете get_redirect_url с **kwargs, ваш pk находится в kwargs и в RedirectView, Django пытается получить ваш url с этим kwargs.

Так что если вы не хотите передавать pk, просто не передавайте kawrgs:

def get_redirect_url(self, *args, **kwargs):
    return super().get_redirect_url()

Вы можете указать url вместо pattern_name, так:

from django.urls import reverse_lazy


class DailyRecordDeleteView(RequiredBasicDetailsMixin, RedirectView):
    urls = reverse_lazy('business:daily_records')

    # no get_redirect_url

Ваш get_redirect_url также не должен удалять записи: протокол HTTP определяет, что GET и OPTION должны быть "безопасными" методами, то есть они должны не иметь побочных эффектов.

Таким образом, вы должны удалять записи с помощью POST/DELETE запроса. Вы можете работать с небольшим FormView, который будет решать эту проблему в случае, если (пустая) форма действительна, переопределив метод form_valid.

Вернуться на верх