Как обновить один элемент в списке из шаблона в 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 %}