Как обновить один элемент в списке из шаблона в Django?

Я ищу лучший способ создания обновляемого списка из объектов модели в Django.

Допустим, у меня есть models.py:


class Foo(models.Model):
    bar = models.CharField(max_length=10, blank=True)
    foo = models.CharField(max_length=30, blank=True)

и у меня есть views.py, который показывает объекты из этой модели:


def my_view(request):
    person_list = Person.objects.all()
    ctx= {'person_list': person_list}
    return render(request, 'my_app/my_view.html', ctx)

Затем у меня есть шаблон, my_view.html:

...

<table>
  <tr>
    <th>bar</th>
    <th>foo</th>
    <th></th>
  </tr>
  {% for item in person_list %}
    <tr>
      <td>{{item.bar}}</td>
      <td>{{item.foo}}</td>
      <td style="width: 5%;"><button type="submit" name="button">Change</button></td>
    </tr>
  {% endfor %}
</table>
...

Итак, я хотел бы добавить форму и сделать одно из полей изменяемым из этого шаблона.

Я хочу, чтобы пользователи могли изменить item.foo, а затем нажать кнопку change, и она отправит обновление в модель.

Я попробовал сделать его формой и использовать forms.py для создания формы, где пользователи могут вводить данные, а затем отправлять форму, и это выглядело следующим образом, my_view.html:

...
...

<table>
  <tr>
    <th>bar</th>
    <th>foo</th>
    <th></th>
  </tr>
  {% for item in person_list %}
  <form method="post">
        {% csrf_token %}
    <tr>
      <td>{{item.bar}}</td>
      <td>{{item.foo}}</td>
      <td>{{form.foo}}</td>
      <td style="width: 5%;"><button type="submit" name="button">Change</button></td>
    </tr>
  </form>
  {% endfor %}
</table>
...
...

И это не работало, потому что я не мог понять, куда отправить PK для этого конкретного элемента в Model.

Любая помощь будет принята с благодарностью.

Вы можете сделать это с помощью class-based views очень легко

Скажите, что это ваш models.py

class MyModel(models.Model):
    alpha = models.CharField(max_length=200)
    beta = models.CharField(max_length=200)
    gama = models.CharField(max_length=200)
    delta = models.CharField(max_length=200)

Ваш views.py должен выглядеть следующим образом

from django.views.generic import UpdateView
from .models import MyModel

class MyModelUpdateView(UpdateView):
    model = MyModel
    fields = ['beta'] # Include the fields you want to update form your template

В качестве справки, это будет ваш CreateView в views.py файле

class MyModelCreateView(CreateView):
    model = MyModel
    template_name = 'myapp/myapp_form.html'
    fields = ['alpha', 'beta', 'gama', 'delta']
    

По умолчанию для UpdateView используется шаблон CreateView, myapp_form.html в данном случае. Это будет ваш основной шаблон формы

{% extends 'base.html' %}

{% block content %}

<form method="POST">
  {% csrf_token %}
    {{ form }}
  <button type="submit">Create</button>
</form>

{% endblock %}
Вернуться на верх