#python #django #django-models #django-views #django-queryset
#python #django #django-models #django-представления #django-queryset
Вопрос:
Новичок в Django здесь, я пытался постоянно работать с этим в течение последних нескольких дней и пытался читать документы и искать решения в Google, но безрезультатно.
В моем проекте django есть два приложения — blog и weather, у каждого из которых есть модель.
blog.models
import datetime
from django.db import models
class BlogEntry(models.Model):
date = models.DateField('Date')
blog_name = models.CharField('Name',max_length = 255, null=True)
погода.модели
import datetime
from django.db import models
class WeatherEntry(models.Model):
date = models.DateField('Date')
weather = models.CharField('Weather',max_length = 255, null=True)
Приложение «Погода» должно заполняться один раз в день, но приложение «Блог» должно заполняться только изредка. Теперь я хочу создать DetailView для моей модели BlogEntry, которая также показывала бы погоду в день создания блога. Мой план состоял в том, чтобы переопределить get_context_data()
, но я не смог отфильтровать набор запросов погоды в соответствии с датой.
В представлении
import datetime
from django.views.generic.detail import DetailView
from blog.models import BlogEntry
from weather.models import WeatherEntry
class BlogDetailView(DetailView):
model = BlogEntry
template_name = 'Blog/blog_detail.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['weather'] = WeatherEntry.objects.filter(date__=date)
return context
Я бы получил сообщение об ошибке NameError: name 'date' is not defined
. Я тоже использовал выражения F, и они тоже не сработали:(
Ответ №1:
Ошибка очевидна. У вас не определена переменная date. Это потому, что переменная даты не определена и не передана get_context_data
методу. Во-первых, вы должны убедиться, что переменная date определена или уже передана get_context_data
методу. Во-вторых, исправьте свой метод отступа. Отступ в python имеет значение. Это должно быть так
class BlogDetailView(DetailView):
model = BlogEntry
template_name = 'Blog/blog_detail.html'
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(**kwargs)
context['weather'] = WeatherEntry.objects.filter(date=self.object.date)
return context
Комментарии:
1. Спасибо. Как я должен определить переменную date для достижения своих целей? Да, я прошу прощения за отступ, он правильный в моем коде, просто ошибка, когда я копирую и вставляю его сюда.
2. Да, я пробовал это раньше и просто попробовал еще раз. При попытке запустить страницу возвращается ошибка «BlogDetailView» объект не имеет атрибута «дата».
3. Позвольте мне увидеть URL-адрес вашего маршрута
4. path(‘<slug:slug> /’, просмотры. BlogDetailView.as_view(), name=»show_entry») Код, который я предоставил выше в основном сообщении, был упрощен для полей модели. Фактический код имеет поле slug, состоящее из замедленной даты и случайных строк в модели BlogEntry. Страница загружается нормально, если я удалю метод get_context_data, просто не смогу получить данные о погоде. Может быть, мне нужно «связать» модель погоды с slug модели BlogEntry?
5. Хорошо. затем, чтобы получить поле даты доступа из BlogEntry, назовите его так
WeatherEntry.objects.filter(date=self.object.date)
. Я обновил ответ.