【问题标题】:Django template showing data of all users instead of one user显示所有用户而不是一个用户的数据的 Django 模板
【发布时间】:2019-01-28 00:17:27
【问题描述】:

我正在尝试检索有关用户个人资料的信息以显示在页面上。问题是它从每个用户那里检索相关信息,而不仅仅是登录的用户。

我曾尝试只请求当时登录的用户,但很遗憾无法让它工作。

HTML

    <div>
        <span class="bold">
            <p>Bio:</p>
        </span>
        <p>
            {{ profile.bio }}
        </p>
    </div>

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, default=None, null=True, on_delete=models.CASCADE)
    bio = models.CharField(max_length=2000)
    instrument = models.CharField(max_length=255, choices=instrument_list, blank=True)
    level = models.CharField(max_length=255, choices=level_list, blank=True)
    preferred_language = models.CharField(max_length=255, choices=language_list, blank=True)
    time_zone = models.CharField(max_length=255, choices=time_list, blank=True)

    def __str__(self):
        return self.profile

    @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 ProfileForm(ModelForm):
    class Meta:
        model = Profile
        exclude = ('user',)

views.py

@login_required
def profile_page_edit(request):
    if request.method == 'POST':
        form = ProfileForm(request.POST)

        if form.is_valid():
            profile = form.save(commit=False)
            profile.user = request.user
            profile.save()
            return redirect('/student/profile-page')

        else:
            form = ProfileForm()

    form = ProfileForm()

    context = {'form': form }
    return render(request, 'student/profile_page_edit.html', context)

@login_required
def profile_page(request):
    form = ProfileForm
    profile = request.user.profile
    args = {'form' : form, 'profile' : profile}
    return render(request, 'student/profile_page.html', args)

我正在尝试让 profile_page 视图仅显示一个用户(当前登录的用户)的相关模型信息。

【问题讨论】:

  • 您需要在表单或html文件中显示数据吗?
  • 我不明白您为什么将Profile.objects.all() 传递给模板并对其进行迭代。除了所有Profiles,您还能期待什么?当前登录的用户是request.user,所以就使用它。
  • 当你得到答案时不要删除你的问题。见meta.stackoverflow.com/questions/378440/…

标签: python html django


【解决方案1】:

您需要过滤查询集,从而获取正确的查询集:

from django.contrib.auth.decorators import login_required

@login_required
def profile_page(request):
    form = ProfileForm()
    profile = request.user.profile
    context = {'form' : form, 'profile' : profile}
    return render(request, 'student/profile_page.html', context)

在模板中,我们当然只渲染profile变量的bio:

 <!-- Bio -->
    <div>
        <span class="bold">
            <p>Bio:</p>
        </span>
        <p>
            {{ profile.bio }}
        </p>
    </div>

请注意,除非您为该用户创建 Profile 对象,否则没有与该 User 关联的 Profile 对象。

【讨论】:

  • 有道理,我假设链接用户模型就足够了。您能否为我提供一个示例或重定向我为用户创建配置文件对象。
  • 您可以调用Profile.objects.create(user=my_user, bio="it's complicated", instrument='theremin')等。但是请注意,由于OneToOneField,您当然只能创建一个 Profile per 用户。
  • 知道了。我会在模型函数、表单或视图下写吗?
  • 那么创建通常在视图或信号处理程序中完成。这可以通过上面的语句来实现,但ModelForm 也可以做到这一点。这取决于您要在何时/何地创建 Profile
  • 我已经这样做了,并且想知道是否可以代替 bio="it's complex",而使用 bio=bio 来检索用户在表单中输入的内容。此外,我必须在我的个人资料模型中为用户字段添加 Null=True,现在我收到一条错误消息,提示用户没有我的“个人资料 = request.user.profile”的个人资料,您指示我放置
猜你喜欢
  • 1970-01-01
  • 2017-05-21
  • 2012-08-14
  • 2016-08-14
  • 2021-08-16
  • 2020-07-13
  • 2022-08-13
  • 2019-01-04
  • 1970-01-01
相关资源
最近更新 更多