【问题标题】:Using two parameters to delete using a Django DeleteView [duplicate]使用 Django DeleteView 使用两个参数进行删除 [重复]
【发布时间】:2013-05-12 11:41:34
【问题描述】:

我正在尝试从特定客户端删除报告,因此目前在我的url.py 中,我正在传递客户端 ID 和报告 ID,希望从客户端 X 中删除报告 Y。我可以使用 @987654323 完成此操作@ ,但希望使用基于类的 DeleteView。

我查看了this example,但无法与我的代码融合。

这是我的代码。

urls.py

url(r'^jsclient/(?P<pk>\d+)/report/(?P<r_pk>\d+)/delete/$', ReportScheduleDeleteView.as_view(), name="report-delete"),

models.py -

class JSClient(models.Model):
    name = models.CharField(max_length=255, unique=True)
    clientAccount = models.CharField(max_length=255)
    ....

class ReportSchedule(models.Model):
    client = models.ForeignKey(JSClient)
    schedRepName = models.CharField(max_length=255)
    reportType = models.CharField(max_length=255, choices=REPORT_TYPE)
    ....

views.py:

class ReportScheduleDeleteView(DeleteView):   
    model = ReportSchedule
    template_name = "report/report_confirm_delete.html"
    success_url = lazy(reverse, str)('jsclient-list')

我确信必须有一种方法可以使用基于类的 DeleteView 来执行此操作,感谢您对此提供任何帮助。

【问题讨论】:

    标签: django django-views django-class-based-views


    【解决方案1】:

    感谢EsseTi 和CCBV site 的提示,我设法解决了我的问题。这可能是显而易见的

    class ReportScheduleDeleteView(DeleteView):
        model = ReportSchedule
        template_name = "report/report_confirm_delete.html"
        success_url = lazy(reverse, str)('jsclient-list')
    
        # Get the parameters passed in the url so they can be used in the 
        # "report/report_confirm_delete.html"     
    
    
    **UPDATE:**
    
        def get_object(self, queryset=None):
            if queryset is None:
                queryset = self.get_queryset()
    
            client = self.kwargs['pk']
            report = self.kwargs['rpk']
    
            queryset = ReportSchedule.objects.filter(client_id=client, id=report)
    
            if not queryset:
                raise Http404
    
            context = {'client_id':client, 'report_id':report}
            return context
    
        # Override the delete function to delete report Y from client X
        # Finally redirect back to the client X page with the list of reports
        def delete(self, request, *args, **kwargs):
            client = self.kwargs['pk']
            report = self.kwargs['rpk']
    
            clientReport = ReportSchedule.objects.filter(client_id=client, id=report)
            clientReport.delete()
    
            return HttpResponseRedirect(reverse('report-list', kwargs={'pk': client}))
    

    希望对某人有所帮助。

    【讨论】:

    • 如果您检查了 get 对象(您在删除函数中放入的内容)会更容易(如果过滤器返回空,则返回 404)。另一件事,您的应用程序不安全。每个用户都可以拨打/jsclient/1/report/1/delete,即使他们不是所有者。你可能需要处理好这个。
    • 感谢您的提示,我会将其添加到我的代码中。
    • 这很适合与 unique_together 一起使用,尽管 @EsseTi 说了什么。
    【解决方案2】:

    和这个Example of Django Class-Based DeleteView类似

    重新定义def get_object(self, queryset=None) 并在内部进行检查。 使用 kwargs 你应该能够从 url 获取参数。

    【讨论】:

    • 我之前确实看过,但对使用它感到困惑,你能展示它如何适用于我的吗?
    • 完全一样。您正在过度设计您的解决方案。您不必传递用户的 pk(这听起来很不安全),您可以从 self.request.user 推断用户。然后你有用户和对象(使用 url 的 pk 值自动加载)。所以只需检查obj.client=user。和其他问题一样。
    • 感谢我设法找到解决方案的提示,一旦我完成它就会发布它:D
    猜你喜欢
    • 2013-03-08
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2023-03-24
    • 2015-10-20
    相关资源
    最近更新 更多