django 如何将数据从模型渲染到视图?

aiazj4mn  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(139)

我有一个名为Coach的模型,我希望它可以在lesson_detail.html中访问,因为当我使用模板{{ coach.first_name }}时,什么都没有显示。我试图使用get_object_or_404从模型中提取数据,但我不确定需要在参数中放入什么。我尝试了一些东西,比如id=pk或下面的代码中的first_name=first_name,但我得到了一个错误,即变量未定义。
views.py

  1. from django.shortcuts import render, get_object_or_404, reverse
  2. from django.views import generic, View
  3. from django.http import HttpResponseRedirect
  4. from .models import Lesson, Coach, Feedback
  5. from .forms import FeedbackForm
  6. class LessonDetail(View):
  7. def get(self, request, slug, *args, **kwargs):
  8. queryset = Lesson.objects.filter(status=1)
  9. lesson = get_object_or_404(queryset, slug=slug)
  10. coach = get_object_or_404(Coach, first_name=first_name)
  11. feedbacks = lesson.feedbacks.filter(approved=True).order_by('-created_on')
  12. liked = False
  13. if lesson.likes.filter(id=self.request.user.id).exists():
  14. liked = True
  15. return render(
  16. request,
  17. "lesson_detail.html",
  18. {
  19. "lesson": lesson,
  20. "feedbacks": feedbacks,
  21. "coach": coach,
  22. "submitted_feedback": False,
  23. "liked": liked,
  24. "feedback_form": FeedbackForm(),
  25. },
  26. )

models.py

  1. class Coach(models.Model):
  2. RECREATIONAL = 'recreational'
  3. FREESTYLE = 'freestyle'
  4. DANCE = 'dance'
  5. PAIRS = 'pairs'
  6. SPECIALIZATION_CHOICES = [
  7. (RECREATIONAL, 'Recreational'),
  8. (FREESTYLE, 'Freestyle'),
  9. (DANCE, 'Dance'),
  10. (PAIRS, 'Pairs'),
  11. ]
  12. first_name = models.CharField(max_length=80)
  13. last_name = models.CharField(max_length=80)
  14. email = models.EmailField(max_length=100)
  15. bio = models.CharField(max_length=140, help_text="Enter a brief bio")
  16. image = CloudinaryField('image', default='placeholder')
  17. specialization = models.CharField(max_length=20, choices=SPECIALIZATION_CHOICES, default=RECREATIONAL)
  18. years_of_experience = models.PositiveIntegerField(default='1', help_text="Enter a positive integer.")
  19. status = models.IntegerField(choices=STATUS, default=0)
  20. class Meta:
  21. ordering = ['pk']
  22. def __str__(self):
  23. return f'Coach {self.first_name} {self.last_name}'
kqqjbcuj

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_namefirst_name = coach.first_name
这是作为一个查询。可以说,它在数据库中获得了 * 第一个 *“教练”。
它还提供零帮助,当涉及到删除的记录。你冒着引用不存在的条目的风险。

  • 关系 *

您可以创建与Coach模型的关系。举例来说:

  1. coach = models.ForeignKey(Coach, on_delete=models.CASCADE)

这将通过ForeignKey创建与模型的链接。
那么,您所需要的就是:

  1. lesson = get_object_or_404(queryset, slug=slug)
  2. coach = lesson.coach

代替

  1. lesson = get_object_or_404(queryset, slug=slug)
  2. coach = get_object_or_404(Coach, first_name=first_name)

这创造了一种关系。使用参数on_delete=models.CASCADE,您可以轻松地删除教练,并且与教练相关的所有内容都将随之删除。
一般来说,关系路线是优选路线。

展开查看全部

相关问题