Джанго, использующий переменную в фильтре внутри цикла For

#python #django #django-templates #django-template-filters #django-custom-tags

Вопрос:

Я пытаюсь получить значение дочернего объекта/поля, используя родительский объект. Родитель-это переменная внутри a 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)
 

Комментарии:

1. Пожалуйста, не реализуйте это в шаблонах, это логика, которая принадлежит представлению(представлениям). Представление должно предоставлять данные таким образом, чтобы вы могли легко их отобразить.

2. @WillemVanOnsem Я добавил в свой views.py фрагмент кода. Не могли бы вы дать мне небольшое руководство, как бы я добавил это к своим взглядам? По какой-то причине я просто продолжаю ходить по кругу с этой простой задачей для получения информации о ребенке от родителя…

3. Поделитесь (соответствующими) частями кода ваших моделей. Поскольку ваш вопрос предполагает создание запроса, вы должны поделиться своими моделями. Плюс ко всему, нельзя по-настоящему понять соотношение (одно ко многим, много к одному, много ко многим) между моделями, не видя их.

4. @AbdulAzizBarkat Я добавил models.py для моделей, которые, по моему мнению, необходимы.

5. Э-э-э, что именно ты пытаешься сделать? Передать название лаборатории на static бирку? Кажется, вам нужно лучше моделировать вещи, вы, вероятно, захотите сделать это для отображения изображения / видео и т. Д. верно? Вы должны использовать ImageField или FileField , поскольку у вас есть не статический ресурс (CSS, JS, изображения, которые не нужно регулярно добавлять), а медиа -ресурс (загруженные пользователем файлы, изображения). Плюс ваш вариант использования также не имеет для меня особого смысла: покажите изображение лаборатории первого запроса лаборатории для конкретного образца.

Ответ №1:

Ладно, я все понял. Мне нужно было вызвать ребенка к родителю немного иначе, чем я это делал. Мне нужно использовать {{ sample.lab_request_set.all.0.lab }} вместо {{ sample.lab_request.lab }}

Для всех, кому это понадобится в будущем, если вы не зададите связанное имя во parent_model_name.child_model_name_set.all внешнем ключе, то это даст вам набор запросов, который вы затем можете повторить или просто выбрать первый, как я сделал с .0 в конце .all . Это работает в шаблоне. Если вам это нужно в файле python, вы будете вызывать функцию с помощью parent_model_name.child_model_name_set.all()