Django добавляет квадратные скобки и кавычки для ввода charfield - PullRequest
0 голосов
/ 31 марта 2020

недавно я столкнулся с довольно странной проблемой с моими формами Django. В настоящее время я работаю над проектом списка задач. Все работает нормально, за исключением того, что всякий раз, когда я добавляю новое задание, его заголовок, похоже, сохраняется в базе данных с дополнительными квадратными скобками и кавычками. Это выглядит как одноэлементный список, но это строка. Я вроде как решил ее, отобразив версию строки из базы данных в заштрихованном виде, но она все еще отображается, например, при редактировании задачи. Надеюсь, у кого-нибудь есть идеи, что может происходить?

models.py:

from django.db import models

class Task(models.Model):
    title = models.CharField(max_length=35)
    completed = models.BooleanField(default=False)
    created_date = models.DateTimeField(auto_now_add=True)
    # added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    author = models.CharField(max_length=50, default='')

    def __str__(self):
        return self.title

forms.py:

from django import forms
from .models import *


class TaskForm(forms.ModelForm):
    class Meta:
        model = Task
        fields = '__all__'
        widgets = {
            'title': forms.TextInput(attrs={'class': 'new_task_text', 'placeholder': 'Add new task'}),
        }


class TaskEditForm(forms.ModelForm):
    class Meta:
        model = Task
        fields = ['title', 'completed']
        widgets = {
            'title': forms.TextInput(attrs={'class': 'new_task_text'}),
        }

views.py:

from django.shortcuts import render, redirect
from .forms import *
from django.contrib.auth.decorators import login_required


@login_required
def list_homepage(request):
    tasks = Task.objects.filter(author=request.user.username)

    for task in tasks:
        if "['" and "']" in task.title:
            task.title = task.title[2:-2]       # CharField returns a string that is looking like one-element list. Have no idea why yet.
                                                # try using form instead of modelform.
    form = TaskForm()
    if request.method == 'POST':
        form = TaskForm({**request.POST, **{'author': request.user.username}})
        if form.is_valid():
            form.save()
        else:
            print(form.errors)
        return redirect('/list/home')

    context = {
        'page_title': 'Todo list',
        'tasks': tasks,
        'form': form,
    }
    return render(request, 'tasks/list.html', context)


@login_required
def update_task(request, pk):
    task = Task.objects.get(id=pk)
    form = TaskEditForm(instance=task)

    if request.method == 'POST':
        form = TaskEditForm(request.POST, instance=task)
        if form.is_valid():
            form.save()
            return redirect('../..')
    context = {
        'form': form,
        'page_title': 'Update task',
    }
    return render(request, 'tasks/update_task.html', context)


@login_required
def delete_task(request, pk):
    task = Task.objects.get(id=pk)

    if request.method == 'POST':
        task.delete()
        return redirect('/list')

    context = {
        'page_title': 'Delete task',
        'task': task,
    }

    return render(request, 'tasks/delete_task.html', context)

список. html:

{% extends 'tasks/base.html' %} 


{% block content %}
<div class="new-task-column">
    <form method="POST", action="#"> {% csrf_token %}
        {{ form.title }}
        <input class="submit" type="submit", value="Create task">
    </form>
</div>

<div class="task-column">
{% for task in tasks %}
        <div class="item-row">

            <div class="task"> 
                    {% if task.completed == True %}
                        <s>{{ task }} </s>
                    {% else %}
                        {{ task }}
                    {% endif %}

            </div>

            <div class="del_upd_container">
                <div class="single-upd-container"><a class="edit_button" href="/list/update_task/{{ task.id }}">Update</a></div>
                <div class="single-del-container"><a class="edit_button" href="/list/delete_task/{{ task.id }}">Delete</a></div>
            </div>
        </div>
{% endfor %}
</div>
{% endblock content %}

update_task. html:

{% extends 'tasks/base.html' %} 

{% block content %}
<div class="new-task-column">
  <form method="POST"> {% csrf_token %}
    <span class="update-task-layout">
      {{ form }}
      <input class="submit" type="submit" name="Update item">
    </span>
  </form>
</div>
{% endblock content %}

Большое спасибо за любую помощь, я действительно ценю это!

...