【问题标题】:Django "ImageField" form value is NoneDjango“ImageField”表单值为无
【发布时间】:2022-06-20 23:18:11
【问题描述】:

我正在尝试为用户实现个人资料图片字段。以下是我尝试实现的每个文件的代码,forms.pymodels.pyviews.pyurls.py

我使用 IDE (vscode) 来调试 django,并在下面的 views.py 中的 user.avatar = form.cleaned_data['avatar'] 行上放置了一个断点,以快速检查 cleaned_data['avatar'] 是否像我预期的那样被填充为用户输入。

但是,即使我在 url 上上传了一个文件,提交后,该行仍显示 None 而预期是一个图像对象,当然它不会保存任何内容,因此也不会对数据库进行任何更改。

# 
# forms.py 
# accounts/forms.py
# 

from accounts.models import UserProfile

# .. 

class UserProfileForm(forms.ModelForm):

    avatar = forms.ImageField(label=_('Avatar'))

    class Meta:
        model = UserProfile
        
        fields = [
            'avatar',
        ]

    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        self.fields['avatar'].required = False

# 
# models.py
# accounts/models.py
# 

from django.contrib.auth.models import User
from PIL import Image 

class UserProfile(models.Model):
    user   = models.OneToOneField(User, on_delete=models.CASCADE)
    avatar = models.ImageField(upload_to="images", blank=True, null=True)

# note: I also did "python manage.py makemigrations accounts; python manage.py migrate accounts;"

# 
# views.py
# accounts/views.py
# 

class UserProfileView(FormView):
    template_name = 'accounts/profile/change_picture.html'
    form_class = UserProfileForm

    def form_valid(self, form):
        user = self.request.user
        user.avatar = form.cleaned_data['avatar']
        user.save()
        
        messages.success(self.request, _('Profile picture has been successfully updated'))

        return redirect('accounts:change_profile_picture')

# 
# urls.py
# accounts/urls.py
# 

from .views import UserProfileView

urlpatterns = [
    # ..
    path('change/profile_picture/', UserProfileView.as_view(), name='change_profile_picture'),
]


代码有什么问题?谢谢。

编辑

根据要求,html accounts/profile/change_picture.html

{% extends 'layouts/html.html' %}

{% load static %}
{% load bootstrap4 %}
{% load i18n %}

{% block content %}

{% include 'head.html' %}

<body>
    
    {% include 'navbar.html' %}

    <div id="content" name="content" class="main container">
        <div class="w-100 p-3"></div>

        <h2>{% trans 'Change profile picture' %}</h2>
        
        <form method="post">
        
            {% csrf_token %}
            {% bootstrap_form form %}
        
            <button class="btn btn-success">{% trans 'Change' %}</button>
        
        </form>

        <div class="w-100 p-3"></div>        
    </div>

    {% include 'footer.html' %}  

</body>

{% endblock %}

【问题讨论】:

  • 你能分享你的html
  • 我编辑了。谢谢。

标签: django


【解决方案1】:

enctype="multipart/form-data" 添加到表单中:

  {% csrf_token %}
  {% bootstrap_form form %}
        
  <button class="btn btn-success">{% trans 'Change' %}</button>
        
</form>

【讨论】:

    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多