【问题标题】:How to query from 2 Models in Class based views in django?如何从 django 中基于类的视图中的 2 个模型中查询?
【发布时间】:2021-08-31 14:17:06
【问题描述】:

我有一个模型Log 和另一个模型Solutions,我正在使用DetailView 来显示每个日志的详细信息

每个日志可以有许多解决方案。 在Solutions 模型中有一个log 字段,即Foreign KeyLog 模型..

现在,如果我想在日志详细信息下方显示该特定日志的所有解决方案,如何在同一 html 模板中访问该特定日志的日志模型和解决方案

models.py:

class Log(models.Model):
    title = models.CharField(blank=False, max_length=500)
    content = models.TextField(blank=False)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    slug = models.SlugField(max_length=50, null=False, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE,null=True, blank=True)
    image = models.ImageField(
        upload_to='images', blank=True)

    def save(self, *args, **kwargs):
        super().save()
        self.slug = self.slug or slugify(self.title + '-' + str(self.id))
        super().save(*args, **kwargs)

    class Meta:
        verbose_name = ("Log")
        verbose_name_plural = ("Logs")

    def __str__(self):
        return f"{self.title}"


    def get_absolute_url(self):
        return reverse("log-detail", kwargs={"question": self.slug})
    

class Solutions(models.Model):
    log = models.ForeignKey(
        Log, on_delete=models.CASCADE, blank=True, null=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE,null=True, blank=True)
    solution = models.TextField(null=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    slug = models.SlugField(max_length=50, null=False, blank=True)
    image = models.ImageField(
        upload_to='images', blank=True)

    def save(self, *args, **kwargs):
        self.slug = self.slug or slugify(self.solution)
        super().save(*args, **kwargs)

    class Meta:
        verbose_name = ("Solution")
        verbose_name_plural = ("Solutions")

    def __str__(self):
        return f"  {self.solution} "

views.py:

class LogDetailView(DetailView):
    model = Log
    slug_url_kwarg = 'question'
    slug_field = 'slug'

log_detail.html:

{% extends 'log/base.html' %}
{%load crispy_forms_tags %}
{% block content %}

<title>Error Logger - {{object.title}}</title>

<div class="main container mt-4 p-3 mb-4">
<img style='display:inline;' class='rounded-circle account-img' src="{{ object.author.profile.avatar.url }}" alt="">

  <h1 style='display:inline;'>
    <a href="#">{{ object.title }}</a>
  </h1>


  <p>Author: <a href="{% url 'profile' object.author   %}">{{ object.author }}</a></p>
  <p>Date and time of creation: {{ object.created }}</p>
  <span> Details </span>:
  <p class="big ml-4">{{ object.content }} <br />

  {% if object.image %}
  <img style="width: 20vw" class="mt-4" src="{{ object.image.url }}" alt="image" />
  {% else %} 
  {% endif %}

  </p>


</div>
<br />

<a
  class="btn btn-outline btn-info button-solution"
  href="#"
  >Add solution</a
>

【问题讨论】:

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


    【解决方案1】:

    您可以通过反向访问关系来枚举模板中的这些,这通常是<i>modelname</i>_set,除非您设置了related_name=…。所以在这种情况下是<b>solutions</b>_set

    {% for solution in object.solutions_set.all %}
        {{ solution }}
    {% endfor %}

    如果ForeignKeyrelated_name=… [Django-doc],例如:

    class Solutions(models.Model):
        log = models.ForeignKey(
            Log,
            on_delete=models.CASCADE,
            blank=True,
            null=True,
            related_name='solutions'
        )
        # …

    然后我们通过以下方式访问它:

    {% for solution in object.solutions.all %}
        {{ solution }}
    {% endfor %}

    注意:通常 Django 模型被赋予一个单数名称,所以Solution而不是Solutions

    【讨论】:

    • 谢谢,这有帮助.. 另外你能解释一下,我们不应该对模型使用复数吗?我有点不明白,如果你能回答这个问题,那就太好了link
    猜你喜欢
    • 2017-08-13
    • 2017-10-18
    • 2018-12-10
    • 1970-01-01
    • 2012-10-09
    • 2020-08-09
    • 2020-08-08
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多