Django在For循环中的过滤器中使用变量

Posted

技术标签:

【中文标题】Django在For循环中的过滤器中使用变量【英文标题】:Django Using Variable in Filter within For Loop 【发布时间】:2021-10-16 21:56:00 【问题描述】:

我正在尝试使用父对象获取子对象/字段值。父级是for loop 中的一个变量,我似乎无法将它交给custom tag

#custom_tags.py
@register.simple_tag()
def assigned_to(sample):
    #sample=sample.pk
    return Lab_Request.objects.filter(sample=sample).first().lab.lab_name

@register.filter()
def assigned_too(sample):
    #sample=sample.pk
    return Lab_Request.objects.filter(sample=sample).first().lab.lab_name
#sample.html
% for sample in samples %

                % static sample.0|assigned_too %

                % if user.profile.employee.pk == sample.inspector.employee.pk or perms.ics.view_sample %

                                    <tr>
                                        <td class="column1"> sample.sample_date </td>
                                        <td class="column2"> sample.status|sample_status_options </td>
                                        <td class="column3"><a href="#"> sample.sample_number </a></td>
                                        <td class="column4"><a href="#"> sample.order.customer.customer_name </a></td>
                                        <td class="column5"><a href="#"> sample.lab_request.placeholder_to_be_replaced  sample.lab_request.lab.lab_name  sample.inspection_request.inspector.employee.employee_first_name </a></td>
                                        <td class="column6"> sample.date_modified|date:'M. d, Y'  </td>
                                    </tr>
                % endif %
            % endfor %

% static sample|assigned_too % 是我正在努力解决的部分。我还尝试编写一个函数并将其称为% assigned_to sample %。如果我使用% static 1|assigned_too %,它确实有效,但它不会像需要的那样迭代我的循环。我不确定我是否以这种最复杂的方式进行操作。我只想要来自父对象的子对象的信息,例如 sample.lab_request.lab.lab_name ,其中sample 是父对象,lab_request 是子模型。

编辑:

#views.py
class SampleHomeView(ListView):
    model = Sample
    samples = Sample.objects.all
    context_object_name = 'samples'
    template_name = 'ics/sample.html'
    ordering = ['-sample_date']
    paginate_by = 10
#urls.py
path('sample/', SampleHomeView.as_view(), name='sample-home'),
#models.py

class Lab_Request(models.Model):
    #Add stuff here
    placeholder_to_be_replaced = models.CharField(max_length=1)
    lab = models.ForeignKey(Lab, on_delete=models.CASCADE, null=True, blank=True)
    sample = models.ForeignKey(Sample, on_delete=models.CASCADE)

class Sample(models.Model):

    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
    status = models.CharField(max_length=2, choices=SAMPLE_STATUS_OPTIONS, default="01")

class Order(models.Model):

    order_number = models.CharField(max_length=19, unique=True, editable=False, default=get_order_number)
    status = models.CharField(max_length=2, choices=ORDER_STATUS_OPTIONS)
    specification = models.ForeignKey(Specification, on_delete=models.CASCADE, null=True, blank=True) #Needs work to determine which spec is appropriate
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

class Lab(models.Model):

    status = models.CharField(max_length=2, choices=STATUS_OPTIONS)
    lab_name = models.TextField(max_length=100, unique=True)

【问题讨论】:

请不要在模板中实现这个,这是属于视图的逻辑。视图应以您可以轻松呈现的方式提供数据。 @WillemVanOnsem 我已在views.py 代码sn-p 中添加。你能给我一些指导,我将如何将其添加到我的观点中吗?出于某种原因,我一直在做这个从父母那里获取孩子信息的简单任务...... 共享模型代码的(相关)部分。由于您的问题涉及进行查询,因此您应该分享您的模型。另外,如果没有看到模型,就无法真正理解模型之间的关系(一对多、多对一、多对多)。 @AbdulAzizBarkat 我已经为我认为需要的模型添加了 models.py。 呃,你到底想做什么?将实验室名称传递给static 标签?似乎您需要更好地建模事物,您可能希望这样做以显示图像/视频等,对吗?您应该使用ImageFieldFileField,因为您拥有的不是静态(CSS、JS、不需要定期添加的图像)资产,而是媒体(用户上传的文件、图像)资产。另外,您的用例对我来说也没有多大意义:显示特定样品的第一个实验室请求实验室的图像。 【参考方案1】:

好的,我想通了。我需要把孩子叫给父母,这与我做的有点不同。我需要使用 sample.lab_request_set.all.0.lab 而不是 sample.lab_request.lab

对于将来需要此功能的任何人,如果您未在 ForeignKey 中设置相关名称,那么它将是 parent_model_name.child_model_name_set.all 这将为您提供一个查询集,然后您可以迭代或只选择第一个,如我在.all 的末尾加上.0。这适用于模板。如果您在 python 文件中需要它,那么您将使用 parent_model_name.child_model_name_set.all() 调用该函数

【讨论】:

以上是关于Django在For循环中的过滤器中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

Django框架模版渲染与过滤器使用

Django模板进阶007

(模版系统全局变量-if判断-for循环-过滤器-模版继承/引用-引用静态文件)

DJango模块语言(DTL)语法简单介绍

django之模板层

08 Django 模板进阶