Вопрос для начинающих: фильтрация дат в соответствии с датой другой модели в Django

#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) . Я обновил ответ.