Django模板:比较变量和分配新变量

时间:2016-03-31 11:36:30

标签: python django django-templates

在我的帖子模型中,我有缩略图和图像字段。当我做post.thumbnail或post.image时,图像会显示出来。但是当我检查我的管理员时,没有保存图像或缩略图。这很奇怪,因为我记得在我编写更多代码之前已经保存了。我改变了一些东西,他们也没有得到保存......反正我没有打扰,因为当我做post.image时图像仍然显示。

现在我正试图让用户能够在我的网站上分享任何帖子。 但这是问题所在。

如果我这样做

<meta property="og:image" content="{{post.thumbnail}}" />

然后,即使我发布图像并且该图像以post.image显示,也会显示一些默认图像(当我没有发布任何图像时,我就会显示默认图像)。

这是我的模板代码:

{% if post.main_image %}
    <img src="{{post.get_image_url}}"  class="img-rounded" alt="☺" height="75" width="75"/>
    {{post.get_image_url }}
{% elif post.video %}
    {% video post.video as my_video %}
    <img src="{{ my_video.thumbnail }}" class="img-rounded" alt="☺" height="75" width="75"/>{% endvideo %}
{% elif post.url %}
    <img src="{{post.image}}"  class="img-rounded" alt="☺ EBAGU" height="75" width="75"/>
{% else %}
    <img src="{{post.thumbnail}}"  class="img-rounded" alt="☺" height="75" width="75"/>
{% endif %}

我的问题是:我被允许做什么

{{post.image}} == {{post.thumbnail}} == {{ my_video.thumbnail }}=={{post.forsharingimage}}

然后像这样使用它:

<meta property="og:image" content="{{post.forsharingimage}}" />

简而言之:设置{{post.something}} == {{post.somethingelse}},然后使用{{post.somethingelse}}作为变量。这有效吗?

这就是我的图片保存方式:

def extract(url):
    g = Goose()
    try:
        article = g.extract(url=url)
        if article.top_image is None:
            return random.choice(myList)

        else:
            if article.top_image.src is None:
              return random.choice(myList)
            else:
                resposne = {'image':article.top_image.src}
                return article.top_image.src
    except ParseError:
        if can_handle():
                handle_exception()
            else:
                print("couldn't handle exception: url={0}".format(url))
                raise


class PostCreateView(CreateView):

     def form_valid(self, form):

            self.object = form.save(commit=False)
            # any manual settings go here
            self.object.moderator = MyProfile.objects.get(user=self.request.user)
            self.object.image = extract(self.object.url) 
            self.object.thumbnail = extractt(self.object.content)
            self.object.save()
            return HttpResponseRedirect(reverse('post', args=[self.object.slug]))

编辑:这就是我所做的,但它不起作用......

<meta property="og:site_name" content="ebagu.net"/>
<meta property="og:title" content="{{post.title}}"/>    
<meta property="og:description" content="{{post.content|safe}}" />
<meta property="article:author" content="ebagu" />
<meta property="og:url" content="{{request.build_absolute_uri}}" />
<meta property="og:image" content="{{post.thumbnail}}" />
 {% if post.main_image %}

<meta property="og:image" content="{{post.get_image_url}}" />

  {% elif post.video %}
  {% video post.video as my_video %}
<meta property="og:image" content="{{ my_video.thumbnail }}" />
        {% endvideo %}
  {% elif post.url %}

<meta property="og:image" content=="{{post.image}}" />

{% else %}

<meta property="og:image" content=="{{post.thumbnail}}" />

{% endif %}

2 个答案:

答案 0 :(得分:1)

我不确定你的问题究竟是什么,因为可能有几个问题。首先,要发布到社交网络,元标记(在您的情况下为OpenGraph og:image)必须包含绝对URL,这不是Django使用的。 Django总是使用相对URL(即使调用mymodel.get_absolute_url())。

您正在做的另一件事是试图找出您的图像是否存在。我根本不理解您的部分问题,所以我专注于元标记问题:

您需要将绝对网址添加为og:image值:

通过调用request.build_absolute_uri(path)在Django中返回绝对URL。

您可以使用如下的模板标签在模板中实现这一目标:

# Change to simple_tag as of Django 1.9
@register.assignment_tag(takes_context=True)
def get_absolute_url(context, relurl):
    if not relurl:
        return None

    request = context['request']
    return request.build_absolute_uri(relurl)

在模板中:

{% load absoluteurl %}
{% if post.main_image %}
    {% get_absolute_url post.main_image.url as image_url %}
{% endif %}
<meta property="og:image" content="{{ image_url }}" />

回答这个问题:

  是的,我被允许做

{{post.image}} == {{post.thumbnail}} == {{ my_video.thumbnail }}=={{post.forsharingimage}}

不,你不能在模板中与两个以上的方面进行比较(最好是以最小的方式为自己尝试虚拟数据)。

因为:==是与布尔结果的比较。

但我认为你真的想做一项任务:= 更不可能有两个以上的方面。

回答这个问题:

  

设置{{post.something}} == {{post.somethingelse}}然后使用{{post.somethingelse}}作为变量。这有效吗?

否则您无法将比较结果中的布尔值指定为模板中的变量。您必须在视图中执行此操作并将其添加到上下文中。这不起作用

{% with 'bla' == 'bla' as test %}
===={% if 'bla' == test %} {{ test }} {% endif %}====
{% endwith %}

抛出:

TemplateSyntaxError
Exception Value: 'with' expected at least one variable assignment

如果您不想进行比较,但仅指定您可以这样做:

{% with 'bla' as test %}
===={% if 'bla' == test %} {{ test }} {% endif %}====
{% endwith %}

如果您想以相同的方式使用不同的变量(在您的情况下是图像),您应该在if-elif-else-block中进行赋值,然后在以下模板代码中使用新变量:

{% if large_image %}
    {% get_absolute_url large_image.image.url as image_url %}
{% elif small_image %}
    {% get_absolute_url small_image.image.url as image_url %}
{% endif %}

Do something with {{ image_url }}

答案 1 :(得分:0)

您似乎想要为模板中的变量赋值。

您可以使用with标记来实现它:

{% with myvar=post.something.special_var %}
    This is {{ myvar }}
{% endwith %}

了解有关标记@ django-docs

的更多信息