Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.3k views
in Technique[技术] by (71.8m points)

image - Django Update Existing ImageField not working

I want to give a user the ability to update the image associated to a record. I have an edit form that allows the user to update various elements of a record all of which are updating correctly except for the image fields. The image field when assigned to the record is displaying so adding the image to the record on creation fo the record works fine. I have reviewed similar Q&As and they have not helped.

Models.py

class ComicInput(models.Model):
        CoverPic = models.ImageField(upload_to='Comic_Pics', default='Comic_Pics/default.png',blank=True)

        def __str__(self):
            return '%s %s %s' % ( self.CoverPic)

        def __unicode__(self):
            return '%s %s %s' % ( self.CoverPic)

Forms.py

 class ComicInputForm(forms.ModelForm):
    class Meta:
        model = ComicInput
        fields = '__all__'

Views.Py

def edit(request, id):
   record = ComicInput.objects.get(pk = id)
   return render(request, 'app/edit.html',{"ComicInput":record})

def update(request, id):
   updaterecord = ComicInput.objects.get(pk = id)
   if request.method == "POST":
    form = editform(request.POST or None, request.FILES or None, instance=updaterecord)
    if form.is_valid():
        edit = form.save(commit=False)
        edit.save()
        return ComicInventory(request)
    else :
        form = editform(instance=updaterecord)
        messages.error(request,"Error, please try again taking note of validation rules on the right")
        return render(request, 'app/edit.html', {'form':form,"ComicInput":updaterecord})

def delete(request, id):
   deleterecord = ComicInput.objects.get(pk = id)
   deleterecord.delete()
   return ComicInventory(request)

Urls.py

path('edit/<int:id>', views.edit, name='edit'),
path('update/<int:id>', views.update, name='update'),
path('delete/<int:id>', views.delete, name='delete'),

Template - edit.html

<!DOCTYPE html>
{% extends "app/layout.html" %}

{% block content %}
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Update Collection Record</title>
</head>
<body>
    <h1>Update your Comic</h1>
    <h4>Values for inputs that contain validation are noted on the right</h4>
        {%if messages%}
            {%for updaterecord in messages%}
            <h3 style="color: green; float:">{{updaterecord}}</h3> 
            {%endfor%}
        {%endif%}
    <div class="container">
        <form method="POST" action="/update/{{ComicInput.id}}" novalidate enctype="multipart/form-data">
            {% csrf_token %}
            <table class="table table-striped">
                <thead class="thead-dark">
                    <tr>
                        <th scope="col">Input</th>
                        <th scope="col">Value</th>
                    </tr>
                </thead>

                <tr>
                    <td>ID</td>
                    <td><input type="text" name="id" value="{{ComicInput.id}}" readonly /></td>
                    <td>Read Only</td>
                </tr>

                <tr>
                    <td>CoverPic</td>
                    <td><input type="text" name="CoverPic" value="{{ComicInput.CoverPic}}" /></td>
                    <td>Must be a file path URL</td>
                </tr>


            </table>
            <input type="submit" value="Update"/> | <a href="{% url 'ComicInventory' %}"> View Collection</a>
        
        
        </form>
    </div>
</body>

{% endblock %}
</html>

NEW HTML

<!DOCTYPE html>
{% extends "app/layout.html" %}

{% block content %}
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Update Collection Record</title>
</head>
<body>
    <h1>Update your Comic</h1>
    <h4>Values for inputs that contain validation are noted on the right</h4>
        {%if messages%}
            {%for updaterecord in messages%}
            <h3 style="color: green; float:none">{{updaterecord}}</h3> 
            {%endfor%}
        {%endif%}
    <div class="container">
        <form method="POST" action="/update/{{ComicInput.id}}" enctype="multipart/form-data">
            {% csrf_token %}
            <table class="table table-striped">


             <thead class="thead-dark">
                    <tr>
                        <th scope="col">Field Name</th>
                        <th scope="col">Current Value</th>
                        <th scope="col">Edit Values</th>

                    </tr>
                </thead>

                <tr>
                    <td>ID</td>
                    <td><input type="text" name="id" value="{{ComicInput.id}}" readonly /></td>
                    <td>Read Only</td>
                </tr>
                <tr>
                    <td>Publisher</td>
                    <<td>"{{ComicInput.Publisher}}"</td>
                    <td>{{ form.Publisher}}</td>
                </tr>

                <tr>
                    <td>BackPic</td>
                    <td>{{form.BackPic}}</td>
                    <td> Current path: "{{ComicInput.BackPic}}" Must be a file path URL</td>
                </tr>
                <tr>
                    <td>CoverPic</td>
                    <td>{{ form.CoverPic}}</td>
                    <td> Current path: "{{ComicInput.CoverPic}}" Must be a file path URL</td>
                </tr>

                <tr>
                    <td>ContentPic</td>
                    <td>{{ form.ContentPic}}</td>
                    <td> Current path: "{{ComicInput.ContentPic}}" Must be a file path URL</td>

            </table>
            <input type="submit" value="Update"/> | <a href="{% url 'ComicInventory' %}"> View Collection</a>
    

    
    
    </form>
</div>

{% endblock %}


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Edit View

def edit(request, id):
   record = ComicInput.objects.get(pk = id)
   form = editform(request.POST or None, request.FILES or None, instance=record)
   return render(request, 'app/edit.html',{'form':form,"ComicInput":record})

**HTML**

<!DOCTYPE html>
{% extends "app/layout.html" %}

{% block content %}
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Update Collection Record</title>
</head>
<body>
    <h1>Update your Comic</h1>
    <h4>Values for inputs that contain validation are noted on the right</h4>
        {%if messages%}
            {%for updaterecord in messages%}
            <h3 style="color: green; float:none">{{updaterecord}}</h3> 
            {%endfor%}
        {%endif%}
    <div class="container">
        <form method="POST" action="/update/{{ComicInput.id}}" enctype="multipart/form-data">
            {% csrf_token %}
            <table class="table table-striped">


             <thead class="thead-dark">
                    <tr>
                        <th scope="col">Field Name</th>
                        <th scope="col">Current Value</th>
                        <th scope="col">Edit Values</th>

                    </tr>
                </thead>
                  {{form}}
            </table>
    
    </form>
</div>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...