使用具有多个PK的URL处理重定向

时间:2019-12-30 09:02:20

标签: django django-forms django-views

我是Django的新手,在填写AddContactEvent表单后无法重定向。提交表单后,这是重定向错误:

  

没有要重定向到的URL。提供网址或定义一个   模型上的get_absolute_url方法。

自AddContactEvent URL path('contacts/<int:pk1>/addcontactevent)起,我很难弄清楚如何重定向它 只有一个PK。在EventDetail网址中,显然有两个pk,分别是联系人pk和事件pk。 EventDetail页面似乎正在创建,但是由于多个PK,我无法将其重定向到该页面。您将如何处理重定向?

urls.py

    path('contacts/<int:pk>', contact_detail.as_view(), name="contact_detail"),
    path('contacts/<int:pk1>/addcontactevent', AddContactEvent.as_view(), name="addcontactevent"),
    path('contacts/<int:pk1>/event/<int:pk2>/update', UpdateContactEvent.as_view(), name="updatecontactevent"),
    path('contacts/<int:pk1>/event/<int:pk2>', EventDetail.as_view(), name="eventdetail"),

views.py

class AddContactEvent(CreateView):
    form_class = ContactEventForm
    template_name = 'crm/contactevent.html'
    def dispatch(self, request, *args, **kwargs):
        """
        Overridden so we can make sure the `Ipsum` instance exists
        before going any further.
        """
        self.contact = get_object_or_404(Contact, pk=kwargs['pk1'])
        return super().dispatch(request, *args, **kwargs)
    def form_valid(self, form):
        """ Save the form instance. """
        contact = get_object_or_404(Contact, pk=self.kwargs['pk1'])
        form.instance.contact = contact
        form.instance.created_by = self.request.user
        return super().form_valid(form)


class UpdateContactEvent(UpdateView):
    model = Event
    def get_object(self):
        pk1 = self.kwargs['pk1']
        pk2 = self.kwargs['pk2']
        contact = get_object_or_404(Contact, pk=pk1)
        event = get_object_or_404(Event, pk=pk2)
        return event

class DeleteContactEvent(DeleteView):
    model = Event

class EventDetail(DetailView):
    template_name = 'crm/eventdetail.html'
    model = Event
    def get_object(self):
        pk1 = self.kwargs['pk1']
        pk2 = self.kwargs['pk2']
        contact = get_object_or_404(Contact, pk=pk1)
        event = get_object_or_404(Event, pk=pk2)
        return event

2 个答案:

答案 0 :(得分:0)

摆脱错误的一种方法是在联系人模型中定义获取绝对URL

def get_absolute_url(self):
    return reverse("contact_detail", kwargs={"pk": self.pk})

答案 1 :(得分:0)

您有一个已保存的Event对象(具有pk),并且您有联系人pk

def get_success_url(self):
    return reverse('eventdetail', kwargs={'pk1': self.kwargs['pk1'], 'pk2': self.object.pk})