django DeleteView — как передать параметр для использования в success_url?

#django #django-views

Вопрос:

Я использую просмотр удаления, где я хочу, чтобы success_url был представлением, которое вызывало просмотр удаления. Этот success_url требует, чтобы ему были переданы два параметра.

Модель

 class Part(models.Model):
    name = models.CharField(max_length=20)
    worker = models.ForeignKey(Worker, on_delete=CASCADE)
    company = models.ForeignKey(Company, on_delete=CASCADE)
 

urls.py

 path('listparts/<uuid:company_pk>/<uuid:worker_pk>/', views.listparts, name='listparts'),
path('deletepart/<uuid:part_pk>/', views.PartDeleteView.as_view(), name='deletepart'),
 

Вид

 def listparts(request, company_pk, worker_pk):
    ...
    ...

class PartDeleteView(DeleteView):
    model = Part
    success_url = reverse_lazy('listparts' company_pk worker_pk)
 

шаблон элементов списка

 <a href="{% url 'deletepart' part_pk %}">Delete this part</a>
 

шаблон confirm_delete

 <div class="row">
    <div class="col-md-3">
      <form class="form-group">
        {% csrf_token %}{{ form|crispy }}
          <div class="form-group">
            <p>Are you sure you want to delete "{{ object }}"?</p>
          <input type="submit" class="btn btn-primary mt-2 mb-2" value="Update">
        </div>
      </form>
    </div>
 

Но я не знаю, как с этим бороться в DeleteView . Я уверен, что это связано с kwargs работой, но я все еще учусь тому, как работают кварги в чем-то вроде def get_success_url(self)

Редактировать Я включил модель Part и шаблон для confirm_delete . Исходя из комментария Виллема Ван Онсема, я изменил PartDeleteView его на:

 class PartDeleteView(DeleteView):
    model = Part

    def get_success_url(self, *args, **kwargs):
        return reverse_lazy('listparts', args={'company_pk':self.company.pk, 'worker_pk':self.worker.pk})
 

С помощью этого кода, после того как я нажму ссылку, чтобы удалить деталь, я перейду к confirm_delete шаблону. Нажатие на Update кнопку ничего не делает. Страница будет перенесена в success_url, и часть не будет удалена.

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

1. Что является вашей частью объекта? У него как-то есть company_pk и worker_pk ?

2. Виллем, да. Я добавил код для модели детали. Я также попробовал новый PartDeleteView взгляд после прочтения ваших комментариев. Правки в моем вопросе.

Ответ №1:

Я думаю , что здесь имеет больше смысла переопределить get_success_url , и, таким образом, реализовать это как:

 from django.urls import reverse

class PartDeleteView(DeleteView):
    model = Part

    def get_success_url(self):
        return reverse(
            'listparts',
            kwargs={
                'company_pk': self.object.company_id
                'worker_pk': self.object.worker_id
            }
        ) 

Вот self.object объект, который был удален, и мы, таким образом, получаем доступ к company_id и worker_id этого объекта в kwargs=… отношении URL, который мы создаем.