【问题标题】:Django : Update ImageField from OneToOne relationDjango:从 OneToOne 关系更新 ImageField
【发布时间】:2016-09-18 16:03:12
【问题描述】:

经过几个小时尝试更新 views.py 中的 ImageField,我需要您的帮助:

型号:

class ImageTeam(models.Model):
    image = models.ImageField(upload_to="imageTeam/", null=False)
    team = models.OneToOneField(Team,on_delete=models.CASCADE,related_name="theImage", null=False)

查看:

def update_team(request, idTeam):

    try :
        team = Team.objects.get(id = idTeam)    
    except Team.DoesNotExist :
        return redirect(teams)
    ...
   if request.method == "POST" :
       form = updateTeamForm(request.POST, request.FILES)
       if form.is_valid() and form.has_changed() :
           team.name = form.cleaned_data["name"]
           ...
           imageForm = form.cleaned_data["image"]
           if imageForm :
               if hasattr(team, 'theImage') :
                    team.theImage.image = imageForm
                    print(team.theImage.image) #Good it prints "<ImageFieldFile: imageName.jpg>"
                    team.theImage.save()  #save doesn't works!
                    print(team.theImage.image) #Bad it prints "<ImageFieldFile: None>"      
                else :
                    #works!
                    ImageTeam.objects.create(image = imageForm, team=team)
            ...

模板:

<form method="POST" enctype="multipart/form-data" action="{% url 'update_team' team.id %}" class="form-signin">
        {% csrf_token %}
        ...
            <div class="row">
                {{ form.image }}
            </div>
        ...

表格:

class updateTeamForm(forms.ModelForm):  
    image = forms.ImageField(widget=forms.ClearableFileInput(attrs={'id':'image_team'}))
    ...
    class Meta : 
        model = Team
        exclude = ['image',...]

我尝试了很多解决方案(获取实例并保存,使用request.FILES['image'],直接写入路径...)

那么为什么 imageField 没有更新呢? 如果我今天能解决这个问题,我会很高兴

【问题讨论】:

    标签: django one-to-one


    【解决方案1】:

    我认为这里的问题是imageForm = form.cleaned_data["name"]。 ImageForm 不是“图像”。如果要存储文件,则需要获取文件。 form.cleaned_data['image'] 是您在这里所需要的。另外,我没有看到任何表单字段name,所以可以肯定保存不会起作用。

    另外,调试这类场景的好方法是你有没有像ipdb 这样的调试器。只需将import ipdb; ipdb.set_trace() 放在函数顶部,并在执行期间逐步执行代码。

    希望这会有所帮助!

    【讨论】:

    • 是的,你是对的,我在写问题时弄错了:当然是 ...cleaned_data['image']。我知道问题出在哪里:我将编辑我的问题(查看我的打印)
    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2011-01-16
    • 2012-10-04
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多