从两个或更多表中显示相关数据在一个DetailView中

huangapple go评论108阅读模式
英文:

Displaying related data from two or more tables in a DetailView

问题

Here's the translation of the code-related part of your message:

我找不到关于在视图调用中如何传递所有命名参数 **kwargs 到覆盖的 "get_context_data" 方法的信息。

有三个模型:

  1. class User(models.Model):
  2. email = models.CharField(unique=True)
  3. company_id = models.IntegerField(blank=True, null=True)
  4. first_name = models.CharField(blank=True, null=True)
  5. last_name = models.CharField(blank=True, null=True)
  1. class Company(models.Model):
  2. logo = models.CharField(blank=True, null=True)
  3. name = models.CharField(blank=True, null=True)
  4. full_name = models.CharField(blank=True, null=True)
  5. address = models.CharField(blank=True, null=True)
  6. phone = models.CharField(blank=True, null=True)
  7. email = models.CharField(blank=True, null=True)
  8. kpp = models.CharField(blank=True, null=True)
  9. okved = models.CharField(blank=True, null=True)
  10. bik = models.CharField(blank=True, null=True)
  1. class Order(models.Model):
  2. user_id = models.IntegerField(blank=True, null=True)
  3. amount_total_cents = models.BigIntegerField()
  4. amount_mean_cents = models.BigIntegerField()
  5. created_at = models.DateTimeField()

模型之间的关联:

Company-User 1对多,User-Order 1对多

在视图中直接输出数据而不覆盖 "get_context_data" 方法时,没有问题。但是,在覆盖该方法并通过主键链接两个表时,就会出现问题:

1.
company/urls.py

  1. urlpatterns = [
  2. path('company/<int:pk>', CompanyShow.as_view(), name='company_show')
  3. ]

company/views.py

  1. class CompanyShow(DetailView):
  2. model = Company
  3. template_name = 'company/company_show.html'
  4. context_object_name = 'company'
  5. def get_context_data(self, **kwargs):
  6. context = super(CompanyShow, self).get_context_data(**kwargs)
  7. context['users'] = User.objects.filter(company_id=self.kwargs['pk'])
  8. return context

company_show.html

  1. <p>ID: {{ company.id }}</p>
  2. <p>Name: {{ company.name }}</p>
  3. <p>Members:
  4. {% for user in users %}
  5. <li>
  6. <a href="{% url 'user:user_show' user.id %}">{{ user }}</a>
  7. </li>
  8. {% endfor %}
  9. </p>

2.
user/urls.py

  1. urlpatterns = [
  2. path('user/<int:pk>', UserShow.as_view(), name='user_show')
  3. ]

user/views.py

  1. class UserShow(DetailView):
  2. model = User
  3. template_name = 'user/user_show.html'
  4. context_object_name = 'user'

user_show.html

  1. <p>ID: {{ user.id}}</p>
  2. <p>Name: {{ user.first_name }}</p>
  3. <p>Surname: {{ user.last_name }}</p>
  4. {% if user.company_id %}
  5. <a href="{% url 'company:company_show' user.company_id %}">
  6. Company profile (id {{ user.company_id }})
  7. </a>
  8. {% else %}
  9. No company
  10. {% endif %}

问题如下:

从 **kwargs 中应传递什么匹配参数到 order/views.py,以便根据 "user" 表中的 "id" 在 "order" 表的 "user_id" 字段中过滤所需对象的列表?并且根据结果,需要在 .html 中显示公司 - 如何连接 "users" 表和 "company" 表?

但是,当绑定发生在订单中时会出现困难:

order/urls.py

  1. urlpatterns = [
  2. path('order/<int:pk>', OrderShow.as_view(), name='order_show')
  3. ]

order/views.py

  1. class OrderShow(DetailView):
  2. model = Order
  3. template_name = 'order/order_show.html'
  4. context_object_name = 'order'
  5. def get_context_data(self, **kwargs):
  6. context = super(OrderShow, self).get_context_data(**kwargs)
  7. context['users'] = User.objects.filter(id=self.kwargs['user_id'])
  8. return context

order_show.html

  1. <p> Member:
  2. {% for user in users %}
  3. <li>
  4. <a href="{% url 'user:user_show' user.id %}">{{ user }}</a>
  5. </li>
  6. {% endfor %}
  7. </p>

在描述的实现中,出现了错误:

  1. 异常类型 KeyError
  2. 异常值 'user_id'
英文:

I did not find information on how all named arguments **kwargs are passed in the overridden "get_context_data" method in the view call.

There are 3 models:

  1. class User(models.Model):
  2. email = models.CharField(unique=True)
  3. company_id = models.IntegerField(blank=True, null=True)
  4. first_name = models.CharField(blank=True, null=True)
  5. last_name = models.CharField(blank=True, null=True)
  1. class Company(models.Model):
  2. logo = models.CharField(blank=True, null=True)
  3. name = models.CharField(blank=True, null=True)
  4. full_name = models.CharField(blank=True, null=True)
  5. address = models.CharField(blank=True, null=True)
  6. phone = models.CharField(blank=True, null=True)
  7. email = models.CharField(blank=True, null=True)
  8. kpp = models.CharField(blank=True, null=True)
  9. okved = models.CharField(blank=True, null=True)
  10. bik = models.CharField(blank=True, null=True)
  1. class Order(models.Model):
  2. user_id = models.IntegerField(blank=True, null=True)
  3. amount_total_cents = models.BigIntegerField()
  4. amount_mean_cents = models.BigIntegerField()
  5. created_at = models.DateTimeField()

Communication between models:

Company-User 1 to M, User-Order 1 to M

There are no problems with direct output of data in the view without overriding the "get_context_data" method. However, there are no problems when overriding the method and linking two tables through the primary key:

1.
company/urls.py

  1. urlpatterns = [
  2. path(&#39;company/&lt;int:pk&gt;&#39;, CompanyShow.as_view(), name=&#39;company_show&#39;)
  3. ]

company/views.py

  1. class CompanyShow(DetailView):
  2. model = Company
  3. template_name = &#39;company/company_show.html&#39;
  4. context_object_name = &#39;company&#39;
  5. def get_context_data(self, **kwargs):
  6. context = super(CompanyShow, self).get_context_data(**kwargs)
  7. context[&#39;users&#39;] = User.objects.filter(company_id = self.kwargs[&#39;pk&#39;])
  8. return context

company_show.html

  1. &lt;p&gt;ID: {{ company.id }}&lt;/p&gt;
  2. &lt;p&gt;Name: {{ company.name }}&lt;/p&gt;
  3. &lt;p&gt;Members:
  4. {% for user in users %}
  5. &lt;li&gt;
  6. &lt;a href=&quot;{% url &#39;user:user_show&#39; user.id %}&quot;&gt;{{ user }}&lt;/a&gt;
  7. &lt;/li&gt;
  8. {% endfor %}
  9. &lt;/p&gt;

2.
user/urls.py

  1. urlpatterns = [
  2. path(&#39;user/&lt;int:pk&gt;&#39;, UserShow.as_view(), name=&#39;user_show&#39;)
  3. ]

user/views.py

  1. class UserShow(DetailView):
  2. model = User
  3. template_name = &#39;user/user_show.html&#39;
  4. context_object_name = &#39;user&#39;

user_show.html

  1. &lt;p&gt;ID: {{ user.id}}&lt;/p&gt;
  2. &lt;p&gt;Name: {{ user.first_name }}&lt;/p&gt;
  3. &lt;p&gt;Surname: {{ user.last_name }}&lt;/p&gt;
  4. {% if user.company_id %}
  5. &lt;a href=&quot;{% url &#39;company:company_show&#39; user.company_id %}&quot;&gt;
  6. Company profile (id {{ user.company_id }})
  7. &lt;/a&gt;
  8. {% else %}
  9. No company
  10. {% endif %}

The question is the following:

What matching parameter should be passed from **kwargs to order/views.py so that the list of required objects is filtered according to the "user" table "id" in the "order" table of the "user_id" field? And according to the result, it is required to display the company in .html - how to connect the table of "users" and the "company" next?

However, the difficulty is when the binding goes in orders:

order/urls.py

  1. urlpatterns = [
  2. path(&#39;order/&lt;int:pk&gt;&#39;, OrderShow.as_view(), name=&#39;order_show&#39;)
  3. ]

order/views.py

  1. class OrderShow(DetailView):
  2. model = Order
  3. template_name = &#39;order/order_show.html&#39;
  4. context_object_name = &#39;order&#39;
  5. def get_context_data(self, **kwargs):
  6. context = super(OrderShow, self).get_context_data(**kwargs)
  7. context[&#39;users&#39;] = User.objects.filter(id = self.kwargs[&#39;user_id&#39;])
  8. return context

order_show.html

  1. &lt;p&gt; Member:
  2. {% for user in users %}
  3. &lt;li&gt;
  4. &lt;a href=&quot;{% url &#39;user:user_show&#39; user.id %}&quot;&gt;{{ user }}&lt;/a&gt;
  5. &lt;/li&gt;
  6. {% endfor %}
  7. &lt;/p&gt;

In the described implementation, the error:

  1. Exception Type: KeyError
  2. Exception Value: &#39;user_id&#39;

答案1

得分: 0

以下是您要翻译的内容:

  1. It turns out to be a simple solution, if not attached to **kwargs: ```context['users'] = User.objects.filter(id = self.object.user_id)```
  2. Final view:
  3. class OrderShow(DetailView):
  4. model = Order
  5. template_name = 'order/order_show.html'
  6. context_object_name = 'order'
  7. def get_context_data(self, **kwargs):
  8. context = super(OrderShow, self).get_context_data(**kwargs)
  9. context['users'] = User.objects.filter(id = self.object.user_id)
  10. return context
  11. And with 3 tables, where two do not have a direct relationship:
  12. class OrderShow(DetailView):
  13. model = Order
  14. template_name = 'order/order_show.html'
  15. context_object_name = 'order'
  16. def get_context_data(self, **kwargs):
  17. context = super(OrderShow, self).get_context_data(**kwargs)
  18. context['users'] = User.objects.filter(id = self.object.user_id)
  19. for user in context['users']:
  20. context['companies'] = Company.objects.filter(id=user.company_id)
  21. return context
英文:

It turns out to be a simple solution, if not attached to **kwargs: context[&#39;users&#39;] = User.objects.filter(id = self.object.user_id)

Final view:

  1. class OrderShow(DetailView):
  2. model = Order
  3. template_name = &#39;order/order_show.html&#39;
  4. context_object_name = &#39;order&#39;
  5. def get_context_data(self, **kwargs):
  6. context = super(OrderShow, self).get_context_data(**kwargs)
  7. context[&#39;users&#39;] = User.objects.filter(id = self.object.user_id)
  8. return context

And with 3 tables, where two do not have a direct relationship:

  1. class OrderShow(DetailView):
  2. model = Order
  3. template_name = &#39;order/order_show.html&#39;
  4. context_object_name = &#39;order&#39;
  5. def get_context_data(self, **kwargs):
  6. context = super(OrderShow, self).get_context_data(**kwargs)
  7. context[&#39;users&#39;] = User.objects.filter(id = self.object.user_id)
  8. for user in context[&#39;users&#39;]:
  9. context[&#39;companies&#39;] = Company.objects.filter(id=user.company_id)
  10. return context

huangapple
  • 本文由 发表于 2023年5月10日 20:31:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/76218457.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定