我有一个名为Coach的模型,我希望它可以在lesson_detail.html中访问,因为当我使用模板{{ coach.first_name }}时,什么都没有显示。我试图使用get_object_or_404从模型中提取数据,但我不确定需要在参数中放入什么。我尝试了一些东西,比如id=pk或下面的代码中的first_name=first_name,但我得到了一个错误,即变量未定义。
views.py
from django.shortcuts import render, get_object_or_404, reverse
from django.views import generic, View
from django.http import HttpResponseRedirect
from .models import Lesson, Coach, Feedback
from .forms import FeedbackForm
class LessonDetail(View):
def get(self, request, slug, *args, **kwargs):
queryset = Lesson.objects.filter(status=1)
lesson = get_object_or_404(queryset, slug=slug)
coach = get_object_or_404(Coach, first_name=first_name)
feedbacks = lesson.feedbacks.filter(approved=True).order_by('-created_on')
liked = False
if lesson.likes.filter(id=self.request.user.id).exists():
liked = True
return render(
request,
"lesson_detail.html",
{
"lesson": lesson,
"feedbacks": feedbacks,
"coach": coach,
"submitted_feedback": False,
"liked": liked,
"feedback_form": FeedbackForm(),
},
)
models.py
class Coach(models.Model):
RECREATIONAL = 'recreational'
FREESTYLE = 'freestyle'
DANCE = 'dance'
PAIRS = 'pairs'
SPECIALIZATION_CHOICES = [
(RECREATIONAL, 'Recreational'),
(FREESTYLE, 'Freestyle'),
(DANCE, 'Dance'),
(PAIRS, 'Pairs'),
]
first_name = models.CharField(max_length=80)
last_name = models.CharField(max_length=80)
email = models.EmailField(max_length=100)
bio = models.CharField(max_length=140, help_text="Enter a brief bio")
image = CloudinaryField('image', default='placeholder')
specialization = models.CharField(max_length=20, choices=SPECIALIZATION_CHOICES, default=RECREATIONAL)
years_of_experience = models.PositiveIntegerField(default='1', help_text="Enter a positive integer.")
status = models.IntegerField(choices=STATUS, default=0)
class Meta:
ordering = ['pk']
def __str__(self):
return f'Coach {self.first_name} {self.last_name}'
1条答案
按热度按时间kqqjbcuj1#
coach = get_object_or_404(Coach, first_name=first_name)
行是您的问题。first_name=first_name
不起作用,因为first_name
未定义。虽然变量 * 是在
Coach
类中定义的,但您永远不会在LessonDetail
中定义它。要解决此问题,请在使用LessonDetail
之前在first_name
中定义它。可以用两种(或多种)不同的方法来解决主要问题。我会通过他们是什么。
正如我所说的,定义
first_name
应该可以做到这一点。这可以通过访问Coach.objects.first()
来实现。如果我们把它赋值给coach
,我们可以简单地定义first_name
:first_name = coach.first_name
。这是作为一个查询。可以说,它在数据库中获得了 * 第一个 *“教练”。
它还提供零帮助,当涉及到删除的记录。你冒着引用不存在的条目的风险。
您可以创建与
Coach
模型的关系。举例来说:这将通过
ForeignKey
创建与模型的链接。那么,您所需要的就是:
代替
这创造了一种关系。使用参数
on_delete=models.CASCADE
,您可以轻松地删除教练,并且与教练相关的所有内容都将随之删除。一般来说,关系路线是优选路线。