【问题标题】:For loop in django retrieving all users instead of one and M2M field data outputdjango中的for循环检索所有用户而不是一个和M2M字段数据输出
【发布时间】:2021-10-10 04:44:47
【问题描述】:

我在 Django 中有 2 个问题:

  1. 以下是我的代码,每当我在模板中使用 For 循环时,它检索的不是一个用户数据,而是所有用户/个人资料数据。但是当我只使用 request.user.profile.first_name 时它才起作用,但是我处于需要从多对多字段中检索数据并且必须使用 For 循环的情况,这将我带到了我的第二个问题

  2. 我需要在多对多字段中使用 For 循环来检索数据,但它正在为所有用户获取数据,请您纠正我哪里做错了吗?或者是否有另一种方法来检索数据而不使用 for 循环(一个用户/个人资料仅在登录后)

models.py

class Department(models.Model):
   name = models.CharField(max_length=50)
   
   def __str__(self):
       return self.name

class Profile(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   first_name = models.CharField(max_length=200)
   last_name = models.CharField(max_length=200)
   email = models.CharField(max_length=200)
   departments = models.ManyToManyField(Department)

views.py

def profilepage(request):
    profiles = Profile.objects.all()
    departments = Department.objects.all()
    context = {
        'profiles': profiles,
        'departments': departments
    }
    return render(request, 'profile.html', context)

profile.html

{% for profile in profiles %}
First Name: {{profile.first_name}}
   {% for department in departments %}
      Department: {{department.name}}
   {% endfor %}
{% endfor %}

【问题讨论】:

    标签: python python-3.x django django-views django-templates


    【解决方案1】:

    您可以通过以下方式访问Profile 的部门:

    {% for profile in profiles %}
    First Name: {{ profile.first_name }}
       {% for department in profile.departments.all %}
          Department: {{ department.name  }}
       {% endfor %}
    {% endfor %}

    为了提高性能,您可以使用.prefetch_related(…) [Django-doc] 通过一个额外的查询来获取所有相关部门,而不是一个查询每个配置文件:

    def profilepage(request):
        profiles = Profile.objects.prefetch_related('departments')
        context = {
            'profiles': profiles
        }
        return render(request, 'profile.html', context)
    1. (…) 我用request.user.profile.first_name

    您可以将单个配置文件传递给模板:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def profilepage(request):
        profile = request.user.profile
        context = {
            'profile': profile
        }
        return render(request, 'profile.html', context)

    然后在不枚举profiles 的情况下渲染它,所以没有 {% for ... %} 循环:

    First Name: {{ profile.first_name }}
       {% for department in profile.departments.all %}
          Department: {{ department.name  }}
       {% endfor %}

    注意:您可以使用 @login_required decorator [Django-doc].

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      相关资源
      最近更新 更多