Django:ModelForms:ImageField总是空的并被ModelForm拒绝

时间:2013-12-05 08:19:37

标签: python django django-models django-forms

我基于多个ModelForm元素创建了一个表单。所有字段都正常工作,不包括 ImageField。由于缺少ImageField form.is_valid()总是返回False - 即使我将request.FILES传递给表单。

为什么带有ImageField的表单始终无效/为空?

表单

class UserProfileForm2(forms.ModelForm):

    class Meta:
        model = models.UserProfile
        fields = ['description', 'picture']

class LocationForm(forms.ModelForm):
    class Meta:
        model = models.Location
        fields = ['city', 'state', 'country']

class UserForm(forms.ModelForm):
    class Meta:
        model = registration_models.User
        fields = ['first_name', 'last_name']

模型

class Location(models.Model):

    city = models.CharField(max_length=100)
    state = models.CharField(max_length=100)
    country = models.CharField(max_length=100)

    def __unicode__(self):
        return ' - '.join([self.city, self.state, self.country])


class UserProfile(models.Model):

    authenticationuser = fields.AutoOneToOneField(AuthUser)
    description = models.TextField()
    picture = models.ImageField(upload_to='uploaded_files/', null=True)
    location = models.ForeignKey(Location, null=True)
    appear_in_public_ranking = models.BooleanField(default=True)

    def __unicode__(self):
        return self.authenticationuser.username

查看

@login_required
def changeprofile(request):
    form = None

    # user posted his new profile settings
    if request.method == 'POST':
        user_form = myforms.UserForm(request.POST)
        user_profile_form = myforms.UserProfileForm2(request.POST, request.FILES)
        location_form = myforms.LocationForm(request.POST)

        forms_are_invalid = not (user_form.is_valid() and user_profile_form.is_valid() and not location_form.is_valid())

        if forms_are_invalid:
            forms = {'user_form':user_form,
                 'user_profile_form':user_profile_form,
                 'location_form':location_form}
            return shortcuts.render(request, 'changeprofile.html', forms)

        location_form.save()
        user_form.save()
        user_profile_form.save()

        return HttpResponseRedirect('/profile')

    else:
        forms = {'user_form':user_form,
            'user_profile_form':user_profile_form,
             'location_form':location_form}
        return shortcuts.render(request, 'changeprofile.html', forms)

模板

        <form action="{% url 'changeprofile' %}" method="post">
        {% csrf_token %}
            {{ user_form }}
            {{ location_form }}
            {{ user_profile_form }}
            <input type="submit" value="Submit" />
        </form>

1 个答案:

答案 0 :(得分:6)

如果您的表单包含文件输入,则必须在表单中将enctype设置为:

<form action="{% url 'changeprofile' %}" method="post" enctype="multipart/form-data">

否则request.FILES将始终为空。