Django表单只发送文件字段

时间:2014-12-22 02:42:59

标签: python django django-forms django-views django-models

大家好,我也是Django和Python的新手。

使用Django 1.8版 和python ver 2.7.6

想要将表单的字段更新到DB中, 所以想同时发送所有这些。 现在问题在于它只上传图像 进入服务器更新数据库的路径.. 哪个好

然而,所有其他字段都不是"文件"保持忽略...因此不会插入到数据库中,也不会在视图方法中作为参数接收。

不得不提一下,例如,我只是添加了描述字段。

这是结构。 基于:

模型, 视图, 形式, HTML

型号:

from django.db import models
from decimal import Decimal
from django.utils.safestring import mark_safe
# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length=150)
    body = models.TextField()
    time = models.DateTimeField()

class ProfileImage(models.Model):
    image = models.FileField(upload_to='profile/%Y/%m/%d')
    description = models.CharField(max_length=150)

表单:

from django import forms

class ProfileImageForm(forms.Form):
    image = forms.FileField(label='Select a profile Image')
    description = forms.CharField(required=True)

查看:

class ProfileImageView(FormView):
    template_name = 'upload.html'
    form_class = ProfileImageForm
    def form_valid(self,form): 
        profile_image = ProfileImage(
            image=self.get_form_kwargs().get('files')['image']), description=self.get_form_kwargs().get('files')['description'])
        if profile_image.is_valid():
          profile_image.save()
          #self.id = profile_image.id
        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('profile_image', kwargs={'pk': self.id})

    class ProfileDetailView(DetailView):
        model = ProfileImage
        template_name = 'upload.html'
        context_object_name = 'image'


    class ProfileImageIndexView(ListView):
        model = ProfileImage
        template_name = 'upload.html'
        context_object_name = 'images'
        queryset = ProfileImage.objects.all()

HTML:

<html>
<head>
  Upload Picture
</head>
<body>
{% block content %}
<form action="{% url "profile_image_upload" %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="submit" />
</form>
{% endblock %}
</body>
</html>

我刚刚尝试通过传递参数&#34; description&#34;来修改类ProfileImageView。 就像这样:

profile_image = ProfileImage(             image = self.get_form_kwargs()。get(&#39; files&#39;)[&#39; image&#39;]),description = self.get_form_kwargs()。get(&#39; files&#39;) [&#39;描述&#39;])

它显示以下错误:

SyntaxError at /blog/upload/
invalid syntax (views.py, line 97)
Request Method: GET
Request URL:    http://127.0.0.1:8000/blog/upload/
Django Version: 1.8
Exception Type: SyntaxError
Exception Value:    
invalid syntax (views.py, line 97)
Exception Location: /home/enigmathor/testPythweb/testPythweb/urls.py in <module>, line 3
Python Executable:  /usr/bin/python
Python Version: 2.7.6
Python Path:    
['/home/enigmathor/testPythweb',
 '/usr/local/lib/python2.7/dist-packages/Django-1.8-py2.7.egg',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/pymodules/python2.7',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Server time:    Mon, 22 Dec 2014 00:54:23 +0000

尝试了很多其他方法,比如在表单有效方法中添加请求参数,以便稍后获取request.POST参数。

像这样:

def form_valid(self,form,request):

上面的小代码的问题是它表明没有发送请求参数。

请一些帮助真的很感激。提前致谢

1 个答案:

答案 0 :(得分:1)

最后它奏效了! 它没有用,因为在Views方法的最开始 form_valid 我以错误的方式获取参数“Description”。

就是这样:

def form_valid(self,form): 
    profile_image = ProfileImage(
        image=self.get_form_kwargs().get('files')['image']), description=self.get_form_kwargs().get('files')['description'])
    if profile_image.is_valid():
      profile_image.save()
      #self.id = profile_image.id
    return HttpResponseRedirect(self.get_success_url())

所以问题就在于:

description=self.get_form_kwargs().get('files')['description']

它应该是:

description=self.get_form_kwargs().get('data')['description']

原因是让Django期望第二个参数为“ file ”类型 当它是“ data ”时。

希望它有助于其他人作为框架的初学者进行交易。

现在可行。

<强>干杯.-