扩展后无法在 Django 模型上保存图像

Posted

技术标签:

【中文标题】扩展后无法在 Django 模型上保存图像【英文标题】:Can´t save images on Django Model after extending it 【发布时间】:2014-09-25 00:11:05 【问题描述】:

我很难处理这个。我扩展了 Django 用户模型。我用新的models.py创建了一个单独的应用程序调用“userprofile”(我有2个应用程序:'userprofile'和'Administration'):

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    profile_image = models.ImageField(upload_to="/perfil/", blank=True, null=True)


User.profile = property(lambda u: UserProfile.objects.get_or_create(user = u)[0])

urls.py:

urlpatterns = patterns('',
    url(r'^perfil/$', 'apps.userprofile.views.user_profile',  name= 'perfil'),
)

还有一个views.py:

# Create your views here.
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
from forms import UserProfileForm
from django.contrib.auth.decorators import login_required

@login_required
def user_profile(request):
    if request.method == 'POST':
        form = UserProfileForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('../index')
    else:
        user = request.user
        profile = user.profile
        form = UserProfileForm(instance = profile)

    args = 
    args.update(csrf(request))

    args['form'] = form

    return render_to_response('profile.html', args)

当然还有forms.py:

from django import forms
from models import UserProfile

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout
from crispy_forms.bootstrap import (FormActions, )

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = UserProfile

    helper = FormHelper()
    helper.form_method = 'POST'
    helper.layout = Layout(
        'profile_image',
        FormActions(Submit('Editar', 'Editar', css_class= 'btn-primary'))
        )

    def save(self,  commit=True):
        fact = super(UserProfileForm, self).save(commit=False)
        if commit:
            fact.save()
        return fact

所以,我想做的是让用户上传一张图片并让它用作个人资料图片。我设置了:

AUTH_PROFILE_MODULE = 'apps.userprofile.UserProfile'  (the app is inside a folder call 'apps' that´s why the first 'apps' before userprofile)

在 settings.py 中,我将“userprofile”的 url 添加到主项目中。现在我有了可以上传图像的模板,问题是图像永远不会保存在数据库中,所以我不能调用函数在模板中显示图像,比如说用户配置文件页面。

有没有人看过代码知道我做错了什么?

【问题讨论】:

您是否在 HTML 中的
元素上设置了 enctype="multipart/form-data"?
【参考方案1】:

根据 Django 1.7 文档,ModelForm 类必须明确指定在调用 save() 方法时应该更新哪些字段。尝试将 fields = __all__ 添加到您的 UserProfileForm 类元中。

Relevant section of ModelForm documentation

注意该链接中注释的第一行:

上述逻辑未包含在表单中的任何字段都不会被设置 通过表单的 save() 方法。

我自己还在学习 Django,但这是我首先要尝试的。 :)

【讨论】:

以上是关于扩展后无法在 Django 模型上保存图像的主要内容,如果未能解决你的问题,请参考以下文章

如果没有给出图像,则 Django 模型函数保存图像字段 = 异常

如何保存具有多个图像的 django 模型?

如何在保存模型后向django管理员显示消息?

使用覆盖保存为抽象模型扩展 Django ModelForm

django 无法在指定中间模型的 ManyToManyField 上设置值。改用管理器

在 Django 中,我无法保存模型的新内容