spoke
spoke

Reputation: 267

Django update model entry using form fails

I want to update a model entry using a form. the problem is that instead of updating the entry it creates a new entry.

def edit(request, c_id):
    instance = get_object_or_404(C, id=int(c_id))

    if request.POST:
        form = CForm(request.POST, instance=instance)
        if form.is_valid():
            form.save()

            return redirect('/a/b', c_id)
    else:
        form = CForm(instance=instance)

        args = {}
        args.update(csrf(request))
        args['form'] = form
        args['c_id'] = c_id

        return render_to_response('a/b.html', args)

HTML code:

<form action="/a/edit/{{ c_id }}/" method="post">
    {% csrf_token %}
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}
            {% if field.help_text %}
                <p class="help">{{ field.help_text|safe }}</p>
            {% endif %}
        </div>
    {% endfor %}
    <input type="submit" value="Submit"/>
</form>

CForm class code

class CForm(forms.ModelForm):
    class Meta:
        model = C
        fields = ['name', 'code']

Upvotes: 0

Views: 49

Answers (1)

Soviut
Soviut

Reputation: 91525

You're checking the request for a POST method incorrectly. request.POST isn't a boolean, it contains a dictionary of post variables and is always going to have the CSRF token in it so it will always be "truthy". What you need is request.method.

Instead of:

if request.POST:

Replace it with:

if request.method == "POST":

Upvotes: 2

Related Questions