Django -来自表单(ModelForm)的数据不保存在现有数据库中

jdgnovmf  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(140)

我试图通过形式发送数据到我的数据库作为我的任务模型的新对象。当我点击提交按钮时,它只会将我重定向到我的其他页面,提交的数据没有发生任何变化,数据也没有保存到我的数据库中。我在多个来源寻找解决方案,但没有找到一个。我是begginer与这个主题,所以每一个反馈将是伟大的。
我的问题:
1.我犯的错误
1.如果我在我的admin.py(从标题字段)中预先填充了slug字段,当我排除slug字段时,它会在表单中预先填充吗?
3.我会感谢有用的知识来源。
model.py

class Task(models.Model):
    is_done = models.BooleanField(default=False)
    title = models.CharField(max_length=100)
    add_time = models.DateTimeField(auto_now_add=True)
    deadline = models.DateTimeField()
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
    slug = models.SlugField()
    description = models.TextField()

forms.py

from django import forms
from .models import Task

class TaskForm(forms.ModelForm):
    class Meta:
        model = Task
        exclude = ["add_time", "is_done"]

模板

<form method="post" class="form" action="{% url 'add-task' %}">
            {% csrf_token %}
            <p>Title: {{ form.title }}</p>
            <p>Deadline: {{ form.deadline }}</p>
            <p>User: {{ form.user }}</p>
            <p>Description: {{ form.description }}</p>
            <button type="submit">Submit</button>
        </form>

views.py

def add_task(request):
    if request.method == 'POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return HttpResponseRedirect("/todolist")

    form = TaskForm()
    return render(request, "todolist/add_task.html", {"form": form})
m3eecexj

m3eecexj1#

很可能表单是无效的,但是因为您构建了一个新的表单,所以即使表单是有效的,您也看不到错误。

from django.shortcuts import redirect

def add_task(request):
    if request.method == 'POST':
        form = TaskForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('name-of-todolist-view')
    else:
        form = TaskForm()
    return render(request, 'todolist/add_task.html', {'form': form})

在模板中,你应该呈现这个 with errors,所以:

<form method="post" class="form" action="{% url 'add-task' %}">
    {% csrf_token %}
    {{ form.non_field_errors }}
    <p>Title: {{ form.title }} {{ form.title.errors }}</p>
    <p>Deadline: {{ form.deadline }} {{ form.deadline.errors }}</p>
    <p>User: {{ form.user }} {{ form.user.errors }}</p>
    <p>Description: {{ form.description }} {{ form.description.errors }}</p>
    <button type="submit">Submit</button>
</form>

然而,问题可能是您的slug包含在表单中,但您没有呈现它:
from django import forms from .models import任务

class TaskForm(forms.ModelForm):
    class Meta:
        model = Task
        exclude = ['add_time', 'is_done', 'slug']

注意:您可以使用django-autoslug [GitHub]自动创建基于其他字段的slug。
注意:通常使用**settings.AUTH_USER_MODEL[Django-doc]引用用户模型比直接使用User模型[Django-doc]更好。有关更多信息,您可以查看文档的 referencing the User model 部分。
注意:虽然大多数表单不处理媒体文件,但最好还是将
request.FILES**[Django-doc]传递给表单,这样,如果您稍后添加额外的媒体字段,所有使用表单的视图都会正确处理文件。

相关问题