代码之家  ›  专栏  ›  技术社区  ›  Bidhan Majhi

Django窗体未保存图像文件

  •  0
  • Bidhan Majhi  · 技术社区  · 6 年前

    在这个webapp中,我有一个问题模型和一个问题图模型。每当用户上传图像时,它都应该保存在media/question\u image文件夹中。 如果我从管理面板上传的话,效果很好,但是当我从网页上传图片时,它不会被保存。事实上,post请求是有效的,我没有得到任何类型的错误。图像未保存到所需位置。

    class QuestionDiagram(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='questionDiagrams')
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    question_diagram = models.ImageField(upload_to='question_diagram/')
    question_diagram_text = models.CharField(max_length = 48)
    date = models.DateTimeField(auto_now_add=True, blank=True, null=True)
    

    表单.py

    class QuestionDiagramForm(forms.ModelForm):
    question_diagram = forms.CharField(widget = forms.FileInput(attrs={'class':'questionDiagram-questionDiagram'}))
    question_diagram_text = forms.CharField(widget = forms.Textarea(attrs={'class':'questionDiagram-questionDiagramText', 'placeholder':'Describe', 'maxlength':'48'}))
    
    class Meta:
        model = QuestionDiagram
        fields = ['question_diagram', 'question_diagram_text']
    

    设置.py

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

    在项目中网址.py(添加了mediaroot和mediaurl) ......

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

    class QuestionDiagramView(View):
    form_class = QuestionDiagramForm
    template_name = 'mechinpy/question_diagram.html'
    
    def get(self, request, slug):
        form = self.form_class(None)
        return render(request, self.template_name, {'form':form})
    
    def post(self, request, slug):
        question = get_object_or_404(Question, slug=slug)
        form = self.form_class(request.POST, request.FILES)
    
        if form.is_valid():
            questiondiagram = form.save(commit=False)
            questiondiagram.user = self.request.user
            questiondiagram.question = question
            questiondiagram.save()
            return redirect('mechinpy:detail', question.slug)
    
        else:
            return render(request, self.template_name, {'form':form})
    

    html格式

    <form class="form-block" method="POST" action="" enctype="multipart/form-data">
    {% csrf_token %}
    
    <!-- Question Diagram Error -->     
    <span class="show-error">{{form.non_field_errors}}</span>
    
    {% for fields in form %}
    <span class="show-error"> {{fields.errors}} </span>
    
    <!-- Question Diagram Fields -->
    <div class="show-field"> {{fields}} </div>
    {% endfor %}
    
    <!-- Question Diagram Submit Button -->
    <div class="submit-content">
        <button class="submit-button" type="submit"> Submit </button>
    </div>
    

    网址.py

    path('m/question/<slug:slug>/diagram/add/', views.QuestionDiagramView.as_view(), name='question_diagram'),
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   bruno desthuilliers    6 年前

    在这里:

    class QuestionDiagramForm(forms.ModelForm):
        question_diagram = forms.CharField(...)
    

    你想要一个 ImageField CharField you don't need to override them just to add css classes .