Контрольный список не может быть изменен, потому что данные не подтвердились
Пытаюсь обновить контрольный список, изменяя название, описание и дату выполнения, но не получаю никаких данных для заполнения форм, так что это странно.
Modles.py
class Checklist(models.Model):
title = models.CharField(max_length=55)
slug = models.SlugField(max_length=500, unique=True, blank=True)
date = models.DateTimeField(auto_now_add=True)
due_date = models.DateTimeField()
check_completed = models.BooleanField(default=False)
description = models.TextField(default="Checklist description")
task = models.ForeignKey(Task, blank=True, null=True, related_name='checklist', on_delete=CASCADE)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Checklist, self).save(*args, **kwargs)
def get_url(self):
return reverse('task_detail', kwargs={
'slug':self.slug
})
def __str__(self):
return self.title
Мой views.py
@login_required
def update_checklist(request, slug):
update_check = Checklist.objects.get(slug=slug)
if request.method == 'POST':
form = ChecklistForm(request.POST, instance=update_check)
form.save()
return redirect('task_detail', slug=slug)
Urls.py
urlpatterns = [
path('projects/', teams, name='teams'),
path('projects/project/<slug>/', projects, name='projects'),
path('projects/tasks/<slug>/', project_detail, name='project_detail'),
path('projects/checklist/<slug>/', task_detail, name='task_detail'),
# Create a new checklist item
path('projects/checklist/new_checklist_item/<slug>/', new_checklist_item, name='new_checklist_item'),
]
forms.py
class ChecklistForm(forms.ModelForm):
class Meta:
model = Checklist
fields = ['title', 'description', 'due_date']
А в моем html у меня есть
<form method="POST" action="{% url 'update_checklists' title.slug %}" class="modal fade" id="task-edit-modal" tabindex="-1" aria-hidden="true">
{% csrf_token %}
<label for="{{ form.title.id_for_label }}" class="col-3">Title</label>
<input class="form-control col"
type="text"
id="{{ form.title.id_for_label }}"
placeholder="Task name"
value="{{ checklist.title }}"
name="{{ form.title.html_name }}" />
</div>
<div class="form-group row">
<label for="{{form.description.id_for_label}}" class="col-3">Description</label>
<textarea class="form-control col"
rows="3"
placeholder="Task description"
id="{{ form.description.id_for_label }}"
name="{{ form.description.html_name }}">
</textarea>
</div>
<hr>
<h6>Timeline</h6>
<div class="form-group row align-items-center">
<label for="{{ form.due_date.id_for_label }}" class="col-3">Due Date</label>
<input class="form-control col"
type="text"
id="{{ form.due_date.id_for_label }}"
name="{{ form.due_date.html_name }}"
placeholder="Select a date"
data-flatpickr data-alt-input="true" />
</div>
Если я пытаюсь поместить form.title.label внутрь label, это ничего не дает. Значит, здесь что-то не так, чего я не могу увидеть.
Я думаю, что причина, по которой ваша форма не подтверждается, заключается в том, что вы опустили поле slug в вашей форме, и поэтому она не сохраняется, так как ваше поле slug имеет уникальное значение True. Вот мое решение.
class ChecklistForm(forms.ModelForm):
class Meta:
model = Checklist
fields = ['title', 'description', 'slug','due_date']
Для того, чтобы обновить данные в бэкенде, вам нужно добавить в форму initial для хранения данных, которые нужно обновить, следующим образом:
def update_checklist(request, slug):
update_check = Checklist.objects.get(slug=slug)
if request.method == 'POST':
form = ChecklistForm(request.POST, instance=update_check,
# The fields you would like to update
initial={
'title':update_check.title,
'description':update_check.description,
'due_date':update_check.due_date,
'slug':update_check.slug})
form.save()
else:
form = ChecklistForm(
initial={
'title':update_check.title,
'description':update_check.description,
'due_date':update_check.due_date,
'slug':update_check.slug})
return redirect('task_detail', slug=slug)
Вам также нужно будет указать начальную форму в вашем HTML-шаблоне следующим образом: это отобразит все данные в вашей форме обновления
<form method="POST" action="{% url 'update_checklists' title.slug %}" class="modal fade" id="task-edit-modal" tabindex="-1" aria-hidden="true">
{% csrf_token %}
<label for="{{ form.title.id_for_label }}" class="col-3">Title</label>
<input class="form-control col"
type="text"
id="{{ form.title.id_for_label }}"
placeholder="Task name"
value="{{ form.initial.title }}"
name="{{ form.initial.title.html_name }}" />
</div>
<div class="form-group row">
<label for="{{form.description.id_for_label}}" class="col-3">Description</label>
<textarea class="form-control col"
rows="3"
placeholder="Task description"
id="{{ form.description.id_for_label }}"
name="{{ form.initial.description }}">{{ form.initial.description }} </textarea>
</div>
<hr>
<h6>Timeline</h6>
<div class="form-group row align-items-center">
<label for="{{ form.due_date.id_for_label }}" class="col-3">Due Date</label>
<input class="form-control col"
type="text"
id="{{ form.due_date.id_for_label }}"
name="{{ form.due_date.html_name }}"
placeholder="Select a date"
data-flatpickr data-alt-input="true" value="{{form.initial.due_date }}" />
</div>
<div class="form-group row align-items-center">
<label for="{{ form.slug.id_for_label }}" class="col-3">Slug</label>
<input class="form-control col"
type="text"
id="{{ form.slug.id_for_label }}"
name="{{ form.slug.html_name }}"
placeholder="Select a date"
data-flatpickr data-alt-input="true" value="{{form.initial.slug }}" />
</div>