首页 > 解决方案 > Django 将方括号和引号添加到 charfield 输入

问题描述

最近我的 Django 表单遇到了一个相当奇怪的问题。我目前正在处理我的待办事项列表项目。一切正常,除了每当我添加一个新任务时,它的标题似乎保存在数据库中,并带有额外的方括号和引号。它看起来像一个元素列表,但它是一个字符串。我通过显示数据库中字符串的 silced 版本解决了这个问题,但它仍然显示,例如在编辑任务时。希望有人知道会发生什么?

模型.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

表格.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'}),
        }

视图.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 %}

非常感谢您的帮助,我真的很感激!

标签: pythondjangoformsquotesbrackets

解决方案


有同样的问题,通过使用将's 的怪异类型(QueryDict)转换为普通字典的方法dict()来解决它。request.POST其余代码,例如save()方法,可能需要稍作调整。


推荐阅读