Контрольный список не может быть изменен, потому что данные не подтвердились

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

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>
Вернуться на верх