【发布时间】:2018-09-10 12:00:23
【问题描述】:
我是使用 django 的新手。在我的应用程序中,我正在上传存储到媒体文件夹的图像。现在,我正在尝试提供用于下载不起作用的图像的链接。我还尝试直接显示图像(在 html 中使用 img),这也不起作用。
我的代码如下:
urls.py
from django.conf.urls import url
from . import views
from django.conf import settings
from django.conf.urls.static import static
app_name = 'workers'
urlpatterns = [
url(r'^$', views.index, name= 'index'),
url(r'^enrollment$',views.enroll, name='enroll'),
url(r'^save_enrollment$',views.save_enrollment, name='save_enrollment'),
]
if settings.DEBUG:
urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
forms.py
from django import forms
from django.forms import ModelForm
from .models import Worker
class Worker_enrollment(forms.ModelForm):
name = forms.CharField(max_length=250)
address = forms.CharField(max_length=500)
phone_number = forms.CharField(max_length=100)
designation = forms.CharField(max_length=1000)
docfile = forms.FileField(label='select an image to upload')
ssn = forms.CharField(max_length=200)
class Meta:
model = Worker
fields = ['name','address','phone_number','designation','docfile','ssn']
models.py:-
from django.db import models
class Worker(models.Model):
name = models.CharField(max_length=250)
address = models.CharField(max_length=500)
phone_number = models.CharField(max_length=100)
designation = models.CharField(max_length=1000)
docfile = models.ImageField(upload_to='documents/')
ssn = models.CharField(max_length=200)
def __str__(self):
return (self.name)
views.py:-
from .models import Worker
from .forms import Worker_enrollment
from django.shortcuts import render, get_object_or_404
from django.conf import settings
def index(request):
workers_info = Worker.objects.all()
context = {
'workers':workers_info
}
return render(request, 'workers/index.html', context)
def enroll(request):
form = Worker_enrollment(request.POST)
if form.is_valid():
return render(request, 'workers/enroll.html', {'form': form})
else:
form = Worker_enrollment()
return render(request, 'workers/enroll.html', {'form': form})
def save_enrollment(request):
worker_info = Worker()
if request.method == 'POST':
form = Worker_enrollment(request.POST,request.FILES)
if form.is_valid():
worker_info.name = form.cleaned_data['name']
worker_info.address = form.cleaned_data['address']
worker_info.designation = form.cleaned_data['designation']
worker_info.phone_number = form.cleaned_data['phone_no']
worker_info.ssn = form.cleaned_data['ssn']
worker_info.docfile = request.FILES['docfile']
worker_info.save()
return render(request,'workers/saves_worker.html',{'worker_info':worker_info})
else:
form = Worker_enrollment()
return render(request, 'workers/saves_worker.html', {'worker_info': worker_info})
enroll.html:-
<form action="save_enrollment" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_ul }}
<input type="submit" value="Submit" />
</form>
saves_worker.html:-
<h1>Worker has been enrolled</h1>
<br>
<h2>Name - {{worker_info.name}}</h2><br>
<h2>PhoneNo - {{worker_info.phone_number}}</h2><br>
<h2>Designtion - {{worker_info.designation}}</h2><br>
<h2>SSN - {{worker_info.ssn}}</h2>
<h2>Address - {{worker_info.address}}</h2>
<h2><a href="{{ worker_info.docfile.url }}" >worker's image</h2>
settings.py文件中指定了以下内容:-
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
【问题讨论】:
-
是
Worker_enrollmentmodelform还是正常形式? -
如果您使用的是
modelform,那么我建议让验证通过表单并让它保存数据,而不是创建Wroker模型的对象并保存它。 -
它是一个模型形式。我确实尝试过(即第一个答案中给出的建议)。它没有任何区别。图像存储在 media/documents 文件夹中)。单击图像链接时,它甚至会在 url 部分显示 media/documents/image_name.jpg,但图像未打开。
-
您的模板
<h2><a href="{{ worker_info.docfile.url }}" >worker's image</h2>中有一处错字。您应该删除worker's并使用其他类似worker image -
没有任何影响
标签: python django image-upload