【问题标题】:django (1.11) manytomanyfield templatetags filterdjango (1.11) manytomanyfield 模板标签过滤器
【发布时间】:2017-04-11 13:29:18
【问题描述】:

任务是这样的:有医生,有专业。一个医生可以有几个专业。有必要按专业对医生名单进行总结。

型号:

class Doctor(models.Model):
    title = models.CharField(max_length=200, verbose_name='Имя')
    slug = models.SlugField(unique=True)
    image = models.ImageField(null=True, blank=True, verbose_name='Фото')
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True, verbose_name='Создано')
    special = models.ManyToManyField('Specialization')
    experience= models.CharField(max_length=200, verbose_name='Стаж', blank=True)
    category = models.CharField(max_length=200, verbose_name='Категория', blank=True)
    content = RedactorField(verbose_name='Контент')
    keywords = models.CharField(max_length=1024, blank=True, null=True)
    description = models.CharField(max_length=1024, blank=True, null=True)

    class Meta:
        verbose_name = 'Врача'
        verbose_name_plural = 'Врачи'

    def __str__(self): # For Python 2, use __unicode__ too
        return self.slug

    def get_absolute_url(self):
        return reverse('show_doctor', kwargs={'slug': self.slug})


class Specialization(models.Model):
    name = models.CharField(max_length=200, verbose_name='Название')
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True, verbose_name='Создано')

    class Meta:
        verbose_name = 'Специализацию'
        verbose_name_plural = 'Специализации'

    def __str__(self):  # For Python 2, use __unicode__ too
        return self.name

模板标签:

from django import template
from doctor.models import Doctor, Specialization

register = template.Library()


@register.inclusion_tag('doctors_list.html')
def get_doctors_list(request):
    special_list = Specialization.objects.all()
    return {
        'doctors_list': Doctor.objects.filter(special=special_list),
        'spec_list': special_list
    }

HTML 模板:

{% for s in spec_list %}
    <h3>{{ s.name }}</h3>
    <ul>
    {% for d in doctors_list %}
        <li><a href="{% url 'doctor_detail' d.slug %}">{{ d.title }}</a></li>
    {% endfor %}
    </ul>
{% endfor %}

应该是:PrtSc。我想不通,帮帮我)

【问题讨论】:

  • 您要删除项目符号吗?
  • 您不应该创建模板标签来从数据库中获取实例。模板不应直接与数据库通信。相反,您想要的是创建一个View。视图会将一些上下文传递给模板以进行渲染。你应该传递的是你想要渲染的医生列表。在模板中,您可以根据专业化过滤和设置结果样式。
  • 我希望看到一个更明显的解决方案。我通过 Views 做了同样的事情 - 结果是一样的

标签: django django-models django-templates


【解决方案1】:

当您为此目的使用模板标签时,您正在以完全错误的方式处理 Django。数据通过上下文变量传递给模板。在您的情况下,您在 Specialization 查询集上添加了 ListView。您应该通过Specialization 模型(doctor_set)中的反向关系访问医生。请将该值的 prefetch_related 添加到查询集中。

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 2019-01-31
    • 2020-02-16
    • 2011-09-30
    • 2011-08-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多