如何从Django中的上下文向表中添加其他类

如何从Django中的上下文向表中添加其他类,django,Django,我有两个功能,一个用于MarketingMessage,另一个用于Slider 我已经有一个MarketingMessage功能,我想添加滑块,因为下面的功能无法正常工作,我想将它们组合在一起,因为它们来自同一型号 这是我想添加到其中的原始函数 def get_context_data(self, **kwargs): context = super(HomeView, self).get_context_data(**kwargs) try:

我有两个功能,一个用于MarketingMessage,另一个用于Slider

我已经有一个MarketingMessage功能,我想添加滑块,因为下面的功能无法正常工作,我想将它们组合在一起,因为它们来自同一型号

这是我想添加到其中的原始函数

    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        try:
            context['marketing_message'] = MarketingMessage.objects.filter(
                active=True).latest('timestamp')
        except MarketingMessage.DoesNotExist:
            context['marketing_message'] = None
        return context
这是我想要去掉的函数,并将其包含到上面的函数中

    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        try:
            context['sliders'] = Sliders.objects.filter(
                active=True).latest('timestamp')
        except Sliders.DoesNotExist:
            context['sliders'] = None
        return context
这就是模型

class MarketingMessage(models.Model):
    title = models.CharField(max_length=60)
    message = models.TextField(
        max_length=120)
    active = models.BooleanField(default=False)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)

    def __str__(self):
        return self.title


class Slider(models.Model):
    title = models.CharField(max_length=60)
    image = models.ImageField(blank=False, upload_to='Marketing')
    header_text = models.CharField(max_length=120, null=True, blank=True)
    middle_text = models.CharField(max_length=120, null=True, blank=True)
    footer_text = models.CharField(max_length=120, null=True, blank=True)
    button_text = models.CharField(max_length=120, null=True, blank=True)
    active = models.BooleanField(default=False)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)

    def __str__(self):
        return self.title
我已经尝试将它们组合到这个函数中,但它不起作用

    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        try:
            context['marketing_message':MarketingMessage.objects.filter(active=True).latest('timestamp'),
                    'slider':Slider.objects.filter(active=True).latest('timestamp')
                    ]
        except MarketingMessage.DoesNotExist:
            context['marketing_message': None,
                    'Slider':None]
        return context

谢谢大家

您的新功能有一些问题。它有几个语法错误。我将编写一个正确的版本,其行为完全符合您的指示,然后提出一些建议

您的新视图如下所示:

def获取上下文数据(self,**kwargs):
context=super(HomeView,self)。获取上下文数据(**kwargs)
尝试:
上下文['marketing_message']=MarketingMessage.objects.filter(
活动=真)。最新('时间戳')
上下文['slider']=slider.objects.filter(
活动=真)。最新('时间戳')
除MarketingMessage.DoesNotExist外:
上下文['marketing_message']=无
上下文['slider']=None
返回上下文
这个问题是,在上面的示例中,
Slider.DoesNotExist
未被处理。在我看来,你有两个很好的选择

  • 如果其中一个查询失败,则将它们都设置为
    None
  • 当查询失败时,分别确定它们是否应为
    None

  • 这实际上取决于当其中一个失败时,你想对上下文做什么。

    我不完全理解你的问题。你能不能从你的第二个
    获取上下文数据
    并将其添加到你的第一个逻辑中?你是否试图将
    营销信息
    滑块
    组合在一起,使它们成为一个单一的模型,而不是一个?@dragonboz是的,它们已经在一个模型中了。我想将它们组合在一个功能中。我们中的一个人误解了一些事情。在您显示的代码中,
    MarketingMessage
    Slider
    是两个独立的类,它们继承了
    models.Model
    ,使它们成为两个不同的模型。现在,您可能有一个单一的视图类(继承自
    views.view
    )。我想这可能就是你的意思。因此,我的答案是从第二个函数手动将
    滑块
    添加到上下文中的逻辑添加到第一个函数中。没有大惊小怪,没有混乱,没有魔术。@DragonBobZ这就是我所做的,但什么都没有发生'def get_context_data(self,**kwargs):context=super(HomeView,self)。get_context_data(**kwargs)try:context['marketing_message':marketing message.objects.filter(active=True)。latest('timestamp')),'slider':slider.objects.filter(active=True).latest('timestamp')]除了MarketingMessage.DoesNotExist:context['marketing_message':None,'slider':None]返回context`您介意将您已经尝试过的内容添加到您的问题中吗?这在评论中很难理解。
        def get_context_data(self, **kwargs):
            context = super(HomeView, self).get_context_data(**kwargs)
            try:
                context['marketing_message'] = MarketingMessage.objects.filter(
                    active=True).latest('timestamp')
                context['slider'] = Slider.objects.filter(
                    active=True).latest('timestamp')
            # this will be triggered when either exception is thrown.
            except (MarketingMessage.DoesNotExist, Slider.DoesNotExist):
                context['marketing_message'] = None
                context['slider'] = None
            return context
    
        def get_context_data(self, **kwargs):
            context = super(HomeView, self).get_context_data(**kwargs)
            try:
                context['marketing_message'] = MarketingMessage.objects.filter(
                    active=True).latest('timestamp')
            except MarketingMessage.DoesNotExist:
                context['marketing_message'] = None
            try:
                context['slider'] = Slider.objects.filter(
                    active=True).latest('timestamp')
            except Slider.DoesNotExist:
                context['slider'] = None
            return context