2016-11-24 44 views
0

出于某种原因,我无法使用Django上传图像。模型正在保存文件名,但将文件保存在我的媒体文件夹中。用Django加载图像

这是我型号

class Quiz(models.Model): 
    name = models.CharField(
     verbose_name ='Quiz Title', 
     max_length  = 50 
     ) 
    description = models.TextField(
     blank   = True, 
     null   = True, 
     verbose_name = 'Quiz Description' 
     ) 
    pool = models.ForeignKey (
     Pool, 
     verbose_name = 'Category of Quiz', 
    ) 
    categories = models.ManyToManyField (
     Category, 
     through   = 'QuizCategory', 
     related_name = 'category', 
     verbose_name = 'Category', 
     help_text  = 'Categories in this Quiz' 
    ) 
    live = models.BooleanField (
     verbose_name = 'Quiz is Live?', 
     default   = False, 
    ) 
    logo = models.ImageField(
     upload_to  = 'logos', 
     blank   = True, 
     ) 
    def __unicode__(self): 
     return u'%s' % (self.name) 

这是我修正查看

def create_quiz(request): 
    if request.method == "POST": 
     form = QuizForm(request.POST, request.FILES) 
     if form.is_valid(): 
      # file is saved 
      form.save() 

编辑

这是FORM声明

class QuizForm (forms.ModelForm): 
    class Meta: 
     model = Quiz 
     fields = ('name', 'description', 'pool', 'categories', 'live', 'logo') 

HTML

 <form method="post" action="{% url 'create-quiz' %}" enctype="multipart/form-data" >{% csrf_token %} 
      <input hidden name="id" value="{% if quiz.id %}{{quiz.id}}{% else %}0{% endif %}" readonly> 
      <div class="col-xs-12 col-sm-8 col-md-6 col-md-offset-2"> 
       <input required type="text" name="name" {% if quiz.name %}value="{{quiz.name}}"{% else %}placeholder="Quiz Name"{% endif %} class="form-control quiz-search-box"> 
       <textarea required name="description" {% if quiz.description %}{% else %}placeholder="Quiz Description"{% endif %} class="form-control quiz-search-box">{% if quiz.description %}{{quiz.description}}{% endif %}</textarea> 
       <select name="pool" class="form-control quiz-search-box"> 
        {% for p in pool %}<option value="{{p.name}}" {% if quiz.pool.name == p.name %}selected{% endif %}>{{p.name}}</option>{% endfor %} 
       </select> 

       <h2>Questions</h2> 
       <table class="table table-condenced"> 
        {% for q in questions %} 
         <tr><td>{{q.name}}</td></tr> 
        {% endfor %} 
        {% if quiz != 'new' %} 
         <a data-toggle='modal' data-target='#myQuestionModal' class="btn btn-primary">Add Question</a> 
        {% endif %} 
       </table> 
      </div> 
      <div class="col-xs-12 col-sm-4 col-md-2 "> 
       <span class="number-of-questions"> 
        Number of questions in this quiz: {{questions|length}} 
       </span> 
       <span class="add-quiz-logo"> 
        {% if quiz.logo %} 
         <img id="logo" src="/media/{{quiz.logo}}" width="150" alt="Logo spacer" /> 
        {% else %} 
         <img id="logo" src="{% static '/img/no-logo.png' %}" width="150" alt="Logo spacer" /> 
        {% endif %} 
        <input id="id_image" type="file" class="" name="logo" onchange="readURL(this);"> 
       </span> 
       <div> 
        <input type="submit" value="Save Quiz" class="btn btn-primary" />     
       </div> 
      </div> 
     </form> 

帮助深受欢迎。谢谢

+0

您是否安装了枕头? – PetarP

+1

我们没有看到您的html,但不要忘记在文档

中设置enctype =“multipart/form-data”:https://docs.djangoproject.com/en/1.10/topics/http/file-uploads /#basic-file-uploads –

+0

我已经忘记了,但我现在已经添加,但仍然不能正常工作 – HenryM

回答

0

鼠标医生解决了这个。我忘了enctype="multipart/form-data"<form>

0

而是贴:

quiz.pool = Pool.objects.get(name=request.POST.get('pool')) 

尝试使用的文件:

quiz.pool = Pool.objects.get(name=request.FILES.get('pool')) 

UPDATE:

另外,应建立与Django的媒体文件的工作。 添加到设置:

MEDIA_URL = '/media/' 
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'media') 

,包括媒体URLPATTERN:

if settings.DEBUG: 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

在这之后,你可以插入图片到你的模板,这样的:

<img src="{{ instance.logo.url }}"/> 
+0

我已经尝试使用FILES而不是POST在相应的字段上,但没有工作 – HenryM