在Django中点击按钮将日期传递给查询集

时间:2019-06-20 23:32:39

标签: python django django-queryset

我有RoastManifest视图,该视图查询date_scheduled(来自RoastManifest模型的字段)并返回不同的值。我将该查询集传递给模板,然后遍历值并将它们显示为HTML文件上的按钮。我可以单击任何按钮并将相应的日期传递到URL中,(当我单击2019年6月20日按钮时((localhost / schedule / 2019-06-20)),从而将我重定向到RoastManifestDetailView。现在,我希望能够仅基于传递给URL的日期(或单击哪个日期按钮)来过滤RoastManifestDetailView。

我尝试RoastManifest.obejects.filter(date_scheduled__date=date.today())只是为了看看我今天是否可以返回任何时间表,但我一直遇到Fielderrors(DateField的不受支持的查询“ date”或不允许加入该字段。)。请注意,我知道这不是我的确切查询集。我希望将变量传递到查询集中。

这是模型: (注意:其中的roast_order仅允许使用adminsortable2库)

class RoastManifest(models.Model):
    def batch_number_incrementer():
        current_max = RoastManifest.objects.order_by('-batch_number').first()
        if current_max:
            return current_max.batch_number + 1
        else:
            return 8000000
    batch_number = models.IntegerField(unique=True,
                                       default=batch_number_incrementer,
                                       )
    product = models.ForeignKey(Product, related_name="products",
                                on_delete=models.PROTECT)
    date_scheduled = models.DateField()
    roaster_profile = models.ForeignKey(RoasterProfile,
                                        on_delete=models.PROTECT)
    roast_order = models.PositiveSmallIntegerField(default=0, blank=False, null=False)

    class Meta:
        ordering = ('roast_order',)

这是我如何安排预定的日子:

class RoastManifestListView(ListView):
    model = RoastManifest
    template_name = 'schedule/scheduled_days.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['days'] = RoastManifest.objects.order_by('date_scheduled').values('date_scheduled').distinct()
        return context

这是我遇到的问题:

class RoastManifestDetailView(TemplateView):
    template_name = 'schedule/roastmanifest_list.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["roasts"] = RoastManifest.objects.get(date_scheduled__date=date.today())
        return context

我希望能够单击某天(按钮)并将该日期传递到查询中,从而返回在该特定日期预定的所有内容。

使用上面的RoastManifestDetailView,我当前收到FieldError

1 个答案:

答案 0 :(得分:0)

通过上面的模型,我相信正确的查询将是:RoastManifest.obejects.filter(date_scheduled=date.today()) ...您的查询正在date字段上寻找名为scheduled_date的字段,但是有一个没有这样的财产。

当您准备根据单击的按钮进行查询时,有几种方法可以执行此操作,但是最简单的方法(也是“ correct-ish-est”方法)是将日期作为查询参数传递给URL: <button href="<URL to route>?date={item.scheduled_date}" ...>或类似的东西(您可能需要在设置中使用日期格式,但是您需要像2019-06-21这样的东西),并且在您看来,您可以使用来获取该参数的值:date = request.GET.get('date', None)将返回日期查询参数的字符串值,然后您可以将其用于查询和其他操作(可能还要进行一些转换),如果没有使用该名称的参数,则返回None