Skip to main content
 首页 » 编程设计

python之如何获取 Django ImageField 的 url

2025年05月04日26duanxz

我正在对仅包含 ImageField 的表单使用 modelformset_factory 方法。表单所基于的模型包含一个用户字段,该字段与扩展 AbstractUser( See Extending User Model with Abstract User ) 的用户模型具有多对一关系。目前,用户的每个实例都有一个相关的用户配置文件,但我还希望允许用户将图像库上传到他们的配置文件中。

模型.py

class Gallery(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)  
    image = models.ImageField(upload_to='user_gallery', blank=True, null=True) 
 
    def create_gallery(sender, **kwargs): 
        if kwargs['created']: 
            user_gallery = Gallery.objects.create(user=kwargs['instance']) 
            user_gallery.save(); 
post_save.connect(create_gallery, sender=User) 

表单.py

class GalleryForm(forms.ModelForm): 
image = forms.ImageField(label='FormImage') 
class Meta: 
    model = Gallery 
    fields = ['image'] 

views.py

def EditProfile(request): 
    GalleryFormSet = modelformset_factory(Gallery, form=GalleryForm, extra=3, max_num=3) 
    if request.method == "POST": 
        formset = GalleryFormSet(request.POST, request.FILES) 
        if formset.is_valid(): 
            for form in formset.cleaned_data: 
                my_image = form['image'] 
                photo = Gallery(user=request.user, image=my_image) 
                photo.save() 
 
            return render(request, 'user_handler/editprofile.html', {'formset': formset}) 
    else: 
        formset = GalleryFormSet() 
    return render(request, 'user_handler/editprofile.html', {'formset': formset}) 

模板

<form id="post_form" method="post" action="" enctype="multipart/form-data"> 
        {% csrf_token %} 
        {{ formset.management_form }} 
 
        {% for form in formset %} 
            {{form.image}} 
            <img src="{{form.image.url}}"/> 
        {% endfor %} 
        <input type="submit" name="submit" value="Submit" /> 
</form> 

我遇到的问题是使用 {{ form.image }} 会产生这个结果:

... 并在图像的源标记中使用 {{ form.image.url }} 绝对不会产生任何结果。当我检查包含它的元素时,它指出来源未知。显然,图像已按照我的意愿保存在数据库中,但我无法使用 .url 功能。是的,我确实定义了媒体根目录:

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
STATIC_URL = '/static/' 
MEDIA_URL = '/media/'    
MEDIA_ROOT = os.path.join(BASE_DIR, 'HighlightPage_Project/media')   

urls.py

urlpatterns = [ 
url(r'^$', views.Login_Redirect), 
url(r'^account/', include('user_handler_app.urls')), 
url(r'^admin/', admin.site.urls), 
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

请您参考如下方法:

尝试用以下代码替换您的代码:

<img src="{{form.image.url}}"/> 

与:

<img src="{{form.instance.image.url}}"/>