简体   繁体   English

Django:ModelForms:ImageField始终为空,并被ModelForm拒绝

[英]Django: ModelForms: ImageField is always empty and rejected by ModelForm

I created a form based on several ModelForm elements. 我基于几个ModelForm元素创建了一个表单。 All fields work fine excluding the ImageField . ImageField之外,所有字段都可以正常工作。 Due to the missing ImageField form.is_valid() always returns False - even though I pass request.FILES to form. 由于缺少form.is_valid() ,即使我将request.FILES传递给form, form.is_valid()始终返回False

Why the form with the ImageField is always invalid / empty? 为什么带有ImageField的表单总是无效/为空?

Forms 形式

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']

Models 楷模

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

View 视图

@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)

Template 模板

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

If your form contains file input then you must set enctype in your form as: 如果您的表单包含文件输入,则必须在表单中将enctype设置为:

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

Otherwise request.FILES will always be empty. 否则request.FILES将始终为空。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM