检索字段的值,该字段通过外键链接到扩展Djangowww.example.com中用户(oneToOne关系)的Profileviews.py

jaxagkaj  于 2023-01-27  发布在  Go
关注(0)|答案(1)|浏览(112)
    • 我想做的事:**

显示Django的电话簿用户模型扩展了与多个模型相关的Profile模型

    • 我所做的:**

当然,我读过Django的文档(4.1)

  • 我有我的经典Django用户模型
  • 我创建了一个"Profile"模型,通过一对一关系(这里简化了)扩展User模型:
class Profile(models.Model):
        
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    entity = models.ForeignKey(Entity, null=True, blank=True, on_delete=models.CASCADE) 

    class Meta:
        ordering = ['entity__name', 'user__last_name']

    def __str__(self):
        return self.user.first_name + " " + self.user.last_name
        
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()
  • 我已经创建了一个"实体"模型(或多或少是人们工作的公司)(这里简化了):
class Entity(CommonFieldsUUID):

    name = models.CharField(max_length=100, unique=True, null=False, default="N.C.")
    alias = models.CharField(max_length=25, unique=True, null=False, default="N.C.")
    
    class Meta:
        verbose_name = "Entity"
        verbose_name_plural = "Entities"

    def __str__(self):
        return self.alias
  • 下面是我的网站www.example.com:views.py :
from .models import User
from django.http import HttpResponse
from django.template import loader

def phonebook(request):
    user = User.objects.filter(is_active=True).values('first_name','last_name','email','profile__entity','profile__pro_ext','profile__pro_gsm','profile__pro_trigram','profile__location')
    
    template = loader.get_template('phonebook/phonebook.html')
    context = {
        'colHeaders': ['Firstname LASTNAME',
                       'Entity',
                       'Extension',
                       'Mobile',
                       'Email',
                       'Initials',
                       'Location'],
        'user': user,
    }
    return HttpResponse(template.render(context, request))
  • 下面是我的模板phonebook.html:
{% extends "main/datatables.html" %}

<!-- TABLE TITLE -->
{% block tableTitle %}Phonebook{% endblock %}

<!-- TABLE HEADER -->
{% block tableHeader %}
    {% if colHeaders %}
        {% for header in colHeaders %}
            <th>{{header}}</th>
        {% endfor %}
    {% else %}
        <p>No results</p>
    {% endif %}
{% endblock %}

<!-- TABLE BODY -->
{% block tableBody %}
    {% if user %}
        {% for person in user %}
        <tr>
            <td>{{person.first_name}} {{person.last_name}}</td>
            <td>{{person.profile__entity}}</td>
            <td>{{person.profile__pro_ext}}</td>
            <td>{{person.profile__pro_gsm}}</td>
            <td>{{person.email}}</td>
            <td>{{person.profile__pro_trigram}}</td>
            <td>{{person.profile__location}}</td>
        </tr>  
        {% endfor %}
    {% else %}
        <p>Pas de données.</p>
    {% endif %}
{% endblock %}

<!-- TABLE FOOTER -->
{% block tableFooter %}
    {% if colHeaders %}
        {% for header in colHeaders %}
            <th>{{header}}</th>
        {% endfor %}
    {% else %}
        <p>No results</p>
    {% endif %}
{% endblock %}

问题:

{{person.profile__entity}}

返回实体的ID,但我试图显示实体模型的名称或别名...
我尝试过的:
1.阅读Django文档:但由于我不确定所涉及的方法,我可能找不到正确的部分
1.在www.example.com和模板中的愚蠢的事情和冒险,如: views.py and template like :
1.

{{person.profile__entity_name}}
{{person.profile__entity.name}}
{{person.profile__entity_entity__name}}

1.使用与DRF类似的方法:

entity = serializers.SlugRelatedField(
        many=False,
        read_only=True,
        slug_field='entity'
    )

1.尝试了这样的方法:https://docs.djangoproject.com/en/4.1/topics/serialization/,但我认为我可能错过了一些步骤,如果这是正确的方式来做。
1.阅读关于听起来像我的问题的帖子:

  1. How to access a field from an extended user in Django?
  2. Reverse query on django extended user profile
    1....
jjjwad0x

jjjwad0x1#

当使用values()搜索foreignKey时,只返回对象的id,而不是对象本身。将profile__entity__name添加到视图中的查询集,以检索实体的名称。

相关问题