【发布时间】:2021-03-06 20:02:06
【问题描述】:
我正在使用基于类的视图 (TemplateView) 来显示来自用户和 UserProfile 模型(用户和 UserProfile 之间的一对一)的一些信息,这按预期工作。 我决定使用相同的 TemplateView 来显示来自 2 个模型的其他一些数据,但我不明白为什么我无法检索和显示信息。 我怀疑这是因为其中一个模型(UserSubscription)有 2 个 fks,一个是用户模型,另一个是“订阅”模型。 我尝试在 fks 中使用related_name,但不确定我是否正确使用它。 代码如下:
models.py
class UserSubscription(models.Model):
user = models.ForeignKey(User, related_name= 'tousers', related_query_name='touser', on_delete=models.CASCADE, null=True, blank=True)
subscription = models.ForeignKey("Subscription", related_name = 'tosubscriptions', related_query_name='tosubscription',on_delete=models.CASCADE, null=True, blank=True)
created_date = models.DateTimeField(auto_now=True, auto_now_add=False, verbose_name="Created Date")
subs_status = models.BooleanField(default=False, verbose_name="Subscription Status")
expiry_date = models.DateTimeField(auto_now=False, auto_now_add=False, verbose_name="Expiry Date")
class Meta:
verbose_name = "User Subscription"
verbose_name_plural = "User Subscriptions"
def __str__(self):
return 'User: ' + str(self.user) + ' ' + 'PK: ' + str(self.pk) + ' Subscription :' + str(self.subscription) + ' ' + 'Expiring the : ' + str(self.expiry_date)
class Subscription(models.Model):
plan_name = models.CharField(max_length=50, null=True, blank=True, verbose_name="Subscription Plan Name")
description = models.TextField(verbose_name="Subscription Plan Description")
price = models.FloatField(verbose_name="Subscription Plan Price")
start_date = models.DateTimeField(auto_now=False, auto_now_add=False, verbose_name="Subscription Plan Start Date")
end_date = models.DateTimeField(auto_now=False, auto_now_add=False, verbose_name="Subscription Plan End Date")
active = models.BooleanField(default=False)
class Meta:
verbose_name = "Subscription"
verbose_name_plural = "Subscriptions"
def __str__(self):
return self.plan_name
views.py
from django.shortcuts import render, redirect
from django.views.generic import TemplateView, UpdateView, ListView
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
from .models import *
from .forms import *
class MyProfileView(TemplateView):
template_name = 'myprofile.html'
def get_context_data(self, **kwargs):
context = super(MyProfileView, self).get_context_data(**kwargs)
context['User'] = User.objects.all()
context['UserProfile'] = UserProfile.objects.all()
context['subscription'] = Subscription.objects.all()
context['usersubscription'] = UserSubscription.objects.all()
return context
myprofile.html
{% extends 'base.html' %}
{% block title %}
My Profile
{% endblock %}
{% block content %}
<p>Username: {{user.username}}</p>
<p>First Name: {{user.first_name}}</p>
<p>Last Name: {{user.last_name}}</p>
<p>Birth Date: {{user.userprofile.birth_date}}</p>
<p>Email: {{user.email}}</p>
<p>Language: {{user.userprofile.language}}</p>
<p>Address: {{user.userprofile.address}}</p>
<p>Postal Code: {{user.userprofile.postal_code}}</p>
<p>Country: {{user.userprofile.country}}</p>
<form action ='{% url "updatemyprofile" %}'>
<button type="submit">Update My Profile</button>
</form>
<hr>
<p>My Current Plan:{{usersubscription.subscription.plan_name}}</p>
<p>Start Date: {{usersubscription.created_date}}</p>
<p>End Date: {{usersubscription.expiry_date}}</p>
<p>Renew:</p>
<hr>
{% endblock %}
urls.py
from django.urls import path
from . import views as gecviews
urlpatterns = [
path('myprofile/', gecviews.MyProfileView.as_view(), name='myprofile'),
path('updatemyprofile/', gecviews.profileUpdate, name='updatemyprofile'),
结果:
用户名:foo
名字:foo
姓氏:酒吧
出生日期:2020 年 2 月 2 日
电子邮件:foo@bar.com
语言:英文
地址:富吧大道
邮政编码:1000
国家:美国
我目前的计划:
开始日期:
结束日期:
续订:
【问题讨论】:
-
您正在对每个返回查询集(多个对象)而不是单个对象的模型执行
.objects.all()。因此,在您的模板中,您必须遍历查询集才能显示您的数据。
标签: django django-views django-templates