【问题标题】:Django Optional ImageField Not WorkingDjango 可选 ImageField 不工作
【发布时间】:2012-07-14 04:04:28
【问题描述】:

我想在我的 django 模型中设置一个可选的图像字段。我在图像字段中设置了空白=真,空=真。输入以下代码后,我在除 place_4_view 之外的所有图像字段中输入图像。单击上传按钮后,我收到错误消息。我错过了什么?

型号

class Findme(models.Model):
   place_2_view=models.ImageField(upload_to="photos",blank=True,null=True)
   place_3_view=models.ImageField(upload_to="photos",blank=True,null=True)
   place_4_view=models.ImageField (upload_to="photos",blank=True,null=True,help_text='Optional.')

上传时出错

Request Method: POST
Request URL:    http://127.0.0.1:8000/find/
Django Version: 1.4
Exception Type: MultiValueDictKeyError
Exception Value:    "Key 'place_4_view' not found in <MultiValueDict: {u'place_2_view': [<TemporaryUploadedFile: 2012-05-17-289.jpg (image/jpeg)>], u'place_3_view': [<TemporaryUploadedFile: Crimo.JPG (image/jpeg)>]}>"
Exception Location: C:\Python27\lib\site-packages\django\utils\datastructures.py in __getitem__, line 258
Python Executable:  C:\Python27\python.exe

观看次数

    def findpic(request):
        extra_data_context={}
           #if there's nothing in the field do nothing.
           if request.method=="POST":
              form=FindmeForm(request.POST, request.FILES)
              if form.is_valid():
                 data=form.cleaned_data
                    newfindmes=Findme(
                        user=request.user,
                        pub_date=datetime.datetime.now(),
                        place_2_view=request.FILES['room_2_view'],
                        place_3_view=request.FILES['room_3_view'],
                        place_4_view=request.FILES['room_4_view'])
                    newfindmes.save()
              extra_data_context.update({'FindmeForm':form})
         else:
             form = FindmeForm()
             extra_data_context.update({'FindmeForm':form})
        extra_data_context.update({'Findmes':Findme.objects.filter(user=request.user)})
        return render_to_response('postme.html',extra_data_context,context_instance=RequestContext(request))

模板

        {% block content %}


        <form enctype="multipart/form-data"  form action="." method="POST">
       {% csrf_token %}
             <div class="post-fed">{{ FindmeForm.as_p}}</div>
             <input type="submit" value="Get It"/> 
              </form>



           {% for Findme in Findmes.object_list %}
         <tr>
         <p> {{Findme.pub_date|timesince }} ago </p> 
   <p><img src="{{Findme.thumbnail_2.url}}" width="83" height="78">
    <img src="{{Findme.thumbnail_3.url}}" width="83" height="78"> {% if Findme.thumbnail_4 %} <img src="{{Findme.thumbnail_4.url}}" width="83" height="78"/>
          {% endif %}  
        <p> Created By {{ Findme.user }}</p>
        {% endfor %}
        {% endblock %}

【问题讨论】:

  • 请记住,运行syncdb 不会修改现有表。根据您的模型检查您的数据库。
  • 你的意思是我应该手动设置?
  • 是的,或者使用一些迁移应用程序,例如south
  • 在我的数据库中。 ImageFields 为 Null=YES 默认值= NULL。我什至删除了数据库并再次运行syncdb并尝试上传,但我收到了上述错误。
  • 用你的观点和你正在使用的表格更新问题。

标签: python django django-models


【解决方案1】:

您的代码似乎在表单提交期间希望密钥位于表单中。

编辑: 您的 findPic 方法正在尝试获取该字段,并且该字段为空时不存在。我建议使用 request.FILES.get 并指定一个默认值,或者测试 request.FILES 是否存在键,或者迭代键本身。基本上,您的代码需要为 request.FILES 准备好为空或不包含您尝试访问的所有字段。

有关使用 request.FILES.get 的示例,请参阅 this answer,有关 request.FILES 对象的其他详细信息,请参阅 Files Django Docs

【讨论】:

  • 这真的应该是一个评论,因为它没有回答任何问题。
  • 如果我要使用request.FILES.get,我该如何指定默认值?我很困惑。
  • 答案已更新,以包含示例链接和 request.FILES 对象上的文档。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2011-02-10
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多