Django的ImageField无法上传图片

3
我正在开发一个简单的游戏网店。我的想法是,开发者可以上传游戏,这些游戏将在 iframe 中显示(因此游戏只是 URL),然后可以玩游戏。
问题在于,发布游戏时,图标图片无法上传。因此,无法显示该图像。
游戏模型:
class Game(models.Model):
    name = models.CharField(max_length=255)
    url = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=9, decimal_places=2)
    developer = models.CharField(max_length=255, blank=True, null=True)
    icon = models.ImageField(upload_to="images/", default="images/default_game_img.png")
    description = models.CharField(max_length=255)
    published = models.DateField(auto_now=False, auto_now_add=True)

我使用 Django ModelForm:

class PublishForm(forms.ModelForm):
    class Meta:
        model = Game
        fields = ['name', 'description', 'url', 'price', 'icon']
        widgets = {
            'description': Textarea(attrs={
                'cols': 80,
                'rows': 4,
                'class': 'form-control'
            }),
        }

表单的生成非常简单,只需按照以下方式进行操作:
<form class="form-horizonal" name="uploadform" enctype="multipart/form-data" method="post">
    {% csrf_token %}
        {{ form }}

        <div class="controls">
            <button type="submit" class="btn">Upload</button>
        </div>
    </div>
</form>

这是我在此处使用的视图:

def publish(request):
    if request.method == 'POST':
        form = PublishForm(request.POST, request.FILES)

        if form.is_valid():

            g = form.save(commit=False)
            g.developer = request.user.username

            g.save()

            profile = UserProfile.objects.get(user=request.user)
            profile.owned_games.add(g)
            profile.save()

            return render(request, 'shop/published.html')

    else:
        form = PublishForm()

    return render(request, 'shop/publish.html', {'form': form})

图片的URL是正确的,但图片本身无法上传。即使我手动将图片移动到那里,如果我将其作为HTML图像的源放置,它也不会显示出来。
在settings.py中,我有以下几行代码:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

我该怎么修复这个问题?

你是否在urlpatterns中添加了static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - neverwalkaloner
1
就是这样!非常感谢,问题已经解决了! - Alqio
2个回答

9

当图片未显示或无法保存时,您应该检查以下多个问题:

  • 1 - 您缺少request.FILES参数。

    2 - 您已对模型进行更改,但尚未进行迁移。

    3 - Django无法创建用于放置图像的文件夹(我从未遇到过这个问题)。

    4 - 在HTML表单中有拼写错误;特别是在这里:enctype="multipart/form-data"(我曾经将multipart/form写成了multipart/form-data)

    5 - 如果您使用的是旧版本的Django,则必须手动添加以下代码到您的urls.py文件中:python urlpatterns = [] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

    6 - 您的文件名可能非常长,导致某些意外行为。


1
4 是让我出错的地方。我忘记在表单中添加那个属性了。 - Badr B

5
您需要将static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)添加到urlpattern中:
urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

详细信息请点击这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接