首页 > 解决方案 > 如何设置 success_url 以重定向回与 UpdateView 中引用的模型不同的模型?

问题描述

# models.py
class Address(models.Model):
    address = models.TextField()

class Doctor(models.Model):
    locations = models.ManyToManyField(Address)

class Patient(models.Model):
    locations = models.ManyToManyField(Address)
# views.py
class PatientDetailView(DetailView):
    model = Patient

class DoctorDetailView(DetailView):
    model = Doctor
class DoctorUpdateView(UpdateView):
    model = Doctor
    fields = ['locations']

class AddressUpdateView(UpdateView):
    model = Address
    fields = ['address']

我希望能够从 DoctorDetaillView 或 PatientDetailView 转到 AddressUpdateView,然后根据我所在的视图返回 DDV 或 PDV。

我可以使用以下命令从 DDV/PDV 路由到 AddressUpdateView:

# detailview1
{% for address in object.address.all %}
    <a href="{% url 'address-update' address.id %}">Update Address</a>
{% endfor %}

我试过了

# detailview1
<a href="{% url 'address_update' adress.id %}?next={% url 'doctor_detail' object.id %}">Update Address</a>

但是这个 url 查询参数本身不起作用。它只是不会让我回到医生详细信息网址。

我知道我需要以某种方式添加success_url、reverse 或其他内容,但我就是想不通。我不能明确地将 get_success_url 返回给 Doctor,因为如果它是针对患者的地址更新,我不希望它返回 DoctorView,反之亦然。

有谁知道我如何从 AddressUpdateView 返回 Doctor 或 Patient detailview 并正确地将其反转回各自的视图?

标签: djangodjango-viewsdjango-templates

解决方案


我认为你可以做的是get_context_data在你的视图中添加一个函数。就像是:

class AddressUpdateView(UpdateView):
    model = Address
    fields = ['address']

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)  # [1]
        context['doctor'] = Doctor.objects.all()      # [2]
        return context

这只是将额外的上下文呈现到您的模板中。请记住,此功能需要[1]运行,因此即使您不使用它也不要删除它。对于[2],您可以实现要应用的任何过滤器以获取适当的医生对象。

那么你可以这样做(假设 Doctor 对象也有一个 ID)

<a href="{% url 'address_update' adress.id %}?next={% url 'doctor_detail' doctor.id %}"></a>

推荐阅读