Я добавляю новую строку вместо того, чтобы вносить изменения в существующую строку в моей БД

Я пытаюсь сохранить свою форму в базе данных. Но мой код добавляет новую строку вместо сохранения изменений в существующей. где моя ошибка?

view.py

    def settings(request):
        error = ''
        if request.method == 'POST':
            new_form = TrafficSourcesForm(request.POST)
            if new_form.is_valid():
                new_form.save()
    
    
    
            else:
                error = 'Something went wrong!'
new_form = TrafficSourcesForm()
    forms = [TrafficSourcesForm(instance=x) for x in TrafficSources.objects.all()]

   
    return render(request, 'mainpage/dashboard.html', {'new_form': new_form, 'forms': forms, 'error': error})

шаблон

<div class="table table-striped table-hover">

            <div class="table-row">
                <th style="width: 42%">Name</th>
                <th style="width: 43%">Token</th>
                <th style="width: 15%">Action</th>
            </div>
        {% for form in forms %}
            <div class="table-row">
                <form method="POST">
                {% csrf_token %}
                <div class="table-cell">{{ form.name }}</div>
                <div class="table-cell">{{ form.token }}</div>
                <div class="table-cell"><button class="btn btn-lg btn-success w-100"">Save</button></div>
                </form>
            </div>
        </div>

Если не понятно: я показываю все таблицы из моей базы данных на странице. Я хочу отредактировать их и сохранить снова в базе данных.

Id рекомендуем получить конкретный объект, который вы хотите изменить. Например. traffic_source = TrafficSources.objects.get(id=<id_here>)

Потому что вы используете POST данные и форму для создания нового экземпляра при каждом запросе:

...
if request.method == 'POST':
    new_form = TrafficSourcesForm(request.POST)
    if new_form.is_valid():
        new_form.save()
...

Чтобы отредактировать объект, сначала нужно получить его экземпляр, что обычно делается с помощью его идентификатора unique identifier (pk). Хотя обычно вы отправляете этот идентификатор, используя захваченное значение url dispatcher. В данном случае я использую скрытое поле:

mainpage/dashboard.html

<body>
    {% if forms %}
        <table class="table table-striped table-hover">
            <thead>
                <tr>
                    <th style="width: 42%">Name</th>
                    <th style="width: 43%">Token</th>
                    <th style="width: 15%">Action</th>
                </tr>
            </thead>

            <tbody>
                {% for form in forms %}
                <form method="POST">
                    {% csrf_token %}
                    <tr>
                        <td>{{ form.name }}</td>
                        <td>{{ form.token }}</td>
                        <input type="hidden" value="{{ form.instance.pk }}" name="id">
                        <td class="table-cell"><button class="btn btn-lg btn-success w-100">Save</button></td>
                    </tr>
                </form>
                {% endfor %}
            </tbody>
        </table>
    {% endif %}

    <form method="POST">
        {% csrf_token %}
        {{new_form.as_p}}
        <div class="table-cell"><button class="btn btn-lg btn-success w-100">Create</button></div>
    </form>
</body>

views.py

def settings(request):
    error = ''
    if request.method == 'POST':
        new_form = TrafficSourceForm(request.POST)
        pk = request.POST.get('id')
        
        if new_form.is_valid():
            if pk:
                TrafficSource.objects.filter(id=pk).update(**new_form.cleaned_data)
            else:
                TrafficSource.objects.create(**new_form.cleaned_data)
                
        else:
            error = 'Something went wrong!'
    new_form = TrafficSourceForm()
    forms = [TrafficSourceForm(instance=x) for x in TrafficSource.objects.all()]
 
    return render(request, 'mainpage/dashboard.html', {'new_form': new_form, 'forms': forms, 'error': error})
Вернуться на верх