django上传图片并显示该图片

时间:2014-12-08 06:23:16

标签: python django

我有一个问题,这是我的代码
当上传图像成功时,它将返回所有数据(item=Item.objects.all())并显示在模板上 如果我只想让用户上传的图片显示在模板上(而不是数据库中的所有图像)怎么办?如何做到这一点?
请指导我!
非常感谢你。

views.py

def background(request):
    if request.method=="POST":
        img = ItemForm(request.POST, request.FILES)
        if img.is_valid():
            img.save()
            return HttpResponseRedirect(reverse('imageupload:background'))    
        img=ItemForm()
    item=Item.objects.all()
    return render(request,'uploader/background.html',{'form':img,'item':item,})

models.py

from sorl.thumbnail import ImageField
class Item(models.Model):
    image = ImageField(upload_to='thumb/')
class ItemForm(forms.ModelForm):
    class Meta:
        model = Item

模板:

<form action="#" method="post" enctype="multipart/form-data">
{% csrf_token %}
    {{form}} <input type="submit" value="Upload" />
</form>

{% for i in item%} 
    {{i.image}}
        {% thumbnail i.image "1024" crop="center" format="PNG"  as im %}
            <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
        {% endthumbnail %}
{% endfor %}    

4 个答案:

答案 0 :(得分:0)

保存时,您可以拥有ID。只需在会话中设置ID即可。因此,当redirecting您可以拥有photo&amp; user也喜欢......

photoId = request.session['photoId']
userId = request.session['_auth_user_id']
item=Item.objects.get(pk=photoId) #you can also use filter by userId

<强>代码:

if img.is_valid():
    img.save()
    request.session['photoId'] = img.id
    return HttpResponseRedirect(reverse('imageupload:background')) 

答案 1 :(得分:0)

如果添加一个可用于跟踪最新上传图像的字段会更好。

class Item(models.Model):
    image = ImageField(upload_to='thumb/')
    upload_time = models.DateTimeField(auto_now=False, auto_now_add=True)

在这里,我添加了一个名为upload_time的参数auto_now_add=True.

DateField.auto_now_add

Automatically set the field to now when the object is first created. 
Useful for creation of timestamps. Note that the current date is always used; 
it’s not just a default value that you can override.

之后,您可以使用Item方法从latest模型中获取最新对象。

def background(request):
    if request.method=="POST":
        img = ItemForm(request.POST, request.FILES)
        if img.is_valid():
            img.save()
            return HttpResponseRedirect(reverse('imageupload:background'))    
    img=ItemForm()
    item=Item.objects.latest('upload_time')
    return render(request,'uploader/background.html',{'form':img,'item':item,})

关于最新消息:

latest(field_name=None)
Returns the latest object in the table, by date, using the field_name provided as the date field.

因此,您将获得单个对象,然后不需要在模板中迭代它。

{{item.image}}
{% thumbnail item.image "1024" crop="center" format="PNG"  as im %}
    <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}

答案 2 :(得分:0)

您不必使用会话并重定向或添加任何额外字段。 ModelForm save() method返回刚刚保存的对象。试试这个:

# views.py
def background(request):
    form = ItemForm(request.POST or None, request.FILES or None)
    item = None
    if request.method=="POST" and form.is_valid():    
        item = form.save()
    return render(request,'uploader/background.html',{'form': form,'item': item,})


# template
<form action="#" method="post" enctype="multipart/form-data">
{% csrf_token %}
    {{form}} <input type="submit" value="Upload" />
</form>

{% if item %} 
    {{ item.image }}
        {% thumbnail item.image "1024" crop="center" format="PNG"  as im %}
            <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
        {% endthumbnail %}
{% endif %}  

答案 3 :(得分:0)

我做了一些略有不同的事情。我的视图每次动态呈现图形图形(图像),因此它不在数据库中。但是要从我的模型中嵌入一个图形实例,这就是我所做的:

首先,我创建了一个视图,从我的数据中呈现图形并创建了一个到达它的URL(通过使用它的id来选择):

    url(r'^graphs/graphImage/(?P<graph_id>\d+?)/$', 'hydro.views.render_graph', name='graphImage'),

无需显示我的视图,但如果我转到该网址,我的视图将被调用,它将呈现图形而仅显示图形。类似于大多数网站,如果你点击图片,你只会得到一个只显示图片的网页。

现在使用此网址:

    url(r'^graphs/(?P<graph_id>\d+?)/$', 'hydro.views.single_graph', name='graph_detail'),

这个观点为这个坏孩子带来了一个模板:

   {% url 'graphImage' graph.id as the_graph %}
        <img src="{{the_graph}}" alt="{{the_graph}}"/>

url部分抓取我的graphImage网址并输入graph.id。然后我将它命名为the_graph以保持简单。

然后我将图像标记作为src作为_graph。不要担心alt它只是显示url,如果它不适用于调试。

所以我所做的是在一个网页上渲染图形,并将其用作图像标记的来源。有一百万种方法可以做这种事情,但这是我最有限的技能,只知道html和django。