【问题标题】:Can't call model to Django template无法将模型调用到 Django 模板
【发布时间】:2020-11-05 14:57:12
【问题描述】:

我正在尝试使用 Django 将模型中的属性调用到我的 HTML 模板中。发生了一些奇怪的事情,因为我只能将我的两个模型之一调用到模板中。据我通过查看我的数据库可以看出,这两种模型都运行良好。这就是我的models.py 的样子

class Respondez(models.Model):
responder = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='scores')
score = models.IntegerField(default=0)
post_time = models.DateTimeField(default=timezone.now)
class Meta:
    ordering = ['post_time']

def __str__(self):
    return self.score

class Profilez(models.Model):
    newuser = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True,null=True)
    preference = models.CharField(max_length=30)
    def __str__(self):
        return self.newuser

我正在尝试致电Profilez但是,只能调用Respondez这是我调用的视图,我对其进行了简化。

@login_required
def add(request):
    p = Profilez()
    z = Respondez()
    context = {
        'p' : p,
        'z' : z
    }
    return render(request, 'rating/add.html', context)

为了测试我是否可以调用我的模型,我在 HTML 中为我的模板添加了简单的标题标签 add.html:

{% extends "rating/base.html" %}
{% block content%}

<h3> {{user.username}} </h3>
<h3> {{ z.post_time }}</h3>
<h3>{{ p.preference }}</h3>

无论我从模型中调用哪个属性,Respondez 的行都有效,但我的 Profilez 模型无效。尽管我的数据库为两个模型的每个属性都保存了值,但这是事实。

我从单独模板的以下视图中获取preference 的输入(第一行不会粘贴正确的缩进),其中用户选择 2 个选项之一:

def onboarding2(request):
p = Prof()
p.newuser = request.user
if request.method == 'POST':
    selected_opt = (request.POST['ob'])
    if selected_opt == 'mood':
        p.preference = 'mood'
    elif selected_opt == 'productivity':
        p.preference = 'productivity'
    else:
        return HttpResponse(400, 'Invalid form')

    p.save()

    return redirect('rating-onboarding3')

context = {
    'p' : p,
}
return render(request, 'rating/onboard2.html', context)

如何准确调用我的 Profilez 模型?这里有什么问题?

【问题讨论】:

  • 只是在这里,还是您也忘记了代码中class Respondez 块的缩进?
  • 抱歉,它粘贴不正确,但我的文件中有正确的缩进

标签: html django django-models django-templates


【解决方案1】:

由于您在构造函数中实例化了Profilez,没有任何参数,因此它的所有字段都没有获得初始值。因此,p.preference 也恰好为空。这就是p.preference 在模板中不可见的原因。

但是,在Respondez的情况下,虽然你仍然在实例化没有参数的对象,但你仍然给z.post_time提供了当前时间的默认值,所以z.post_time正在工作。

如果你想访问p.preference,你需要显式地为p.preference分配一些值,否则模板将如何显示没有初始化值的东西的值?例如,您可以在创建对象时执行p = Profilez(preference='xyz'),看看会发生什么。

此外,如果您想从数据库中获取特定条目,则需要执行 查询,而不是创建新对象。创建查询的语法类似于Profilez.objects.get(newuser=some_random_user)

【讨论】:

  • 谢谢!我实际上只是使用 p.newuser 作为示例来显示 Profilez 模型不会加载。我要加载的真正属性是 p.preference,这是一个 char 字段,我看到它是从一个单独的视图在我的数据库中填写的。我在我的数据库中看到它,知道为什么我无法将 p.preference 调用到模板中吗?在你向我展示我之前得到空值之后,p.newuser 现在工作顺利!
  • @YusufA 看来您是 SO 社区的新手。请使用不起作用的实际代码更新您的问题,而不是为解释您的场景而创建的假设代码。一旦我看到问题出在哪里,我会更新我的答案。
  • @YusufA,同样,因为你在做p = Profilez(),你不会得到Profilez模型本身的任何字段的任何东西。 p = Profilez() 这行实际上意味着创建一个Profilez 的新实例,并且您还没有为任何字段提供值,所以它们都将为空。如果您尝试改用p = Profilez(preference='xyz'),当您在模板中访问p.preference 时,您将获得xyz
  • 我应该澄清一下,我的问题包含我尝试过但不起作用的真实代码。我在 Profilez 模型中尝试了这两个对我不起作用的属性,我发现我应该使用偏好属性发布问题,因为这正是我正在寻找的。感谢您的澄清! xyz 的事情确实奏效了。我更新了我的问题,以显示用户在到达此页面之前在哪里提交他们的偏好。是否有 p = Profilez() 之外的方法将模板连接到用户提交的首选项?
  • @YusufA 通过执行p=Profilez() 您正在创建一个空对象。里面什么都没有。如果里面什么都没有,你怎么能指望它打印p.preference?如果要打印p.preference,则需要显式地为p.preference 分配一些值。我已经更新了我的答案,见上文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2021-06-16
  • 2018-12-10
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多