【问题标题】:Django DetailView and get requestDjango DetailView 并获取请求
【发布时间】:2019-08-14 01:44:37
【问题描述】:

我有一个带有下拉列表的详细视图。用户可以在下拉列表中选择一个项目,有关该项目的信息应显示在其下方。这要求 DetailView 包含如下内容:

def get_context_data(self, **kwargs):
    context = super(InvoiceDetail, self).dispatch(*args, **kwargs)
    request = self.request

    if request.GET:
        try:
            invoice_selector = request.GET.get('invoice_selector', None)
            invoice = Invoice.objects.get(id = int(invoice_selector) ) # either a string representing a number or 'add invoice'
            context_object_model = invoice
        except ValueError:
            return HttpResponseRedirect(reverse('accounting:add_invoice'))

    return context

如何覆盖 context_object_model?上面的代码没有做出改变。

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    这不是您在get_context_data 中应该做的事情。您应该在 get 方法中检查“添加发票”,然后在 get_object 中完成其余的操作。

    class MyDetailView(DetailView):
        ...
        def get(self, request, *args, **kwargs):
            self.invoice_selector = request.GET.get('invoice_selector')
            if self.invoice_selector = 'add invoice':
                return HttpResponseRedirect(reverse('accounting:add_invoice'))
            return super().get(request, *args, **kwargs)
    
        def get_object(self):
            if self.invoice_selector:
                obj = self.model.objects.get(pk=self.invoice_selector)
            else:
                obj = super().get_object()
    
            return obj
    

    【讨论】:

    • 感谢您的回答。它确实使我走上了正确的道路。但是,它需要一些修改才能完美运行。我编辑了你的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2014-02-05
    • 2011-05-08
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2017-11-26
    • 2017-09-12
    相关资源
    最近更新 更多