我有一个问题,这是我的代码
当上传图像成功时,它将返回所有数据(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 %}
答案 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。