#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, который мы создаем.