【问题标题】:Django version 3.1.3 form not saving to modelDjango 3.1.3 版表单未保存到模型
【发布时间】:2020-11-15 06:41:34
【问题描述】:

我正在关注这个tutorial

我已经返回并编写了完全匹配的代码。我有另一个名为 category_add 的表单,它与此表单完全相同。但是对于我的生活,我无法弄清楚为什么 bookmark_add 不使用表单条目更新数据库。

Models.py

from django.db import models
from django.contrib.auth.models import User


class Category(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)

    created_by = models.ForeignKey(User, related_name='categories', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'Categories'

    def __str__(self):
        return self.title


class Bookmark(models.Model):
    category = models.ForeignKey(Category, related_name='bookmarks', on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)
    url = models.CharField(max_length=255, blank=True)

    created_by = models.ForeignKey(User, related_name='bookmarks', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

View.py

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

from .forms import BookmarkForm


@login_required
def bookmark_add(request, category_id):
    if request.method == 'POST':
        form = BookmarkForm(request.POST)
        if form.is_valid():
            bookmark = form.save(commit=False)
            bookmark.created_by = request.user
            bookmark.category_id = category_id
            bookmark.save()
            return redirect('category', category_id=category_id)

    else:
        form = BookmarkForm()

    context = {
        'form': form
    }

    return render(request, 'bookmark/bookmark_add.html', context)

Forms.py

from django.forms import ModelForm

from .models import Bookmark


class BookmarkForm(ModelForm):
    class Meta:
        model = Bookmark
        fields = ['title', 'description', 'url']

Urls.py

    path('', dashboard, name='dashboard'),
    path('categories/', categories, name='categories'),
    path('categories/add/', category_add, name='category_add'),
    path('categories/<int:category_id>/', category, name='category'),
    path('categories/<int:category_id>/add_bookmark', bookmark_add, name='bookmark_add')
]

bookmark_add.html

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

{% block content %}
<div class="container">
    <h1 class="title">Add link</h1>

    <form method="post" action=".">
        {% csrf_token %}
        {{ form.as_p }}

        <button type="submit" class="button is-primary">Submit</button>
    </form>
</div>

{% endblock %}

【问题讨论】:

  • 点击提交按钮时会发生什么?你会被重定向到category 视图吗?
  • 感谢您的评论。是的,我被重定向到类别就好了,好像一切正​​常。但是现在应该包含我新保存的数据的类别中没有任何内容。当我以管理员(超级用户)身份登录时,我的书签中没有保存任何内容。
  • 好吧,如果您被重定向到category,那么似乎something 似乎已保存到数据库中。我对 django ModelForms 的速度不是很了解,但我在 BookmarkForm 的类定义中看到字段设置为仅 title, description, url。这是否意味着只保存那些字段?如果是这样,它将如何将该书签链接到特定用户?
  • BookmarkForm 正在使用 django 的表单机制根据这些选定的条目在我的 html 中填充一个 from。这不用于保存,但如果您查看我的 view.py,我有表单 = BookmarkForm(request.POST) 以及它们下处理数据并将用户分配给数据的行(即 created_by)。
  • 调用 save() 后,bookmark.pk 应该被填充。您能否记录该值,然后在数据库中查找该条目以查看是否有任何可以解释问题的内容?

标签: python python-3.x django django-forms django-3.1


【解决方案1】:

解决了这个问题!

这是一个愚蠢的问题,也是我的疏忽。感谢 youtube 上的内容创建者。我只需要将“/”附加到 add_bookmark 的 url 路径。

问题: path('categories/&lt;int:category_id&gt;/add_bookmark', bookmark_add, name='bookmark_add')

解决方法: path('categories/&lt;int:category_id&gt;/add_bookmark/', bookmark_add, name='bookmark_add')

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 2021-06-28
    • 2021-03-25
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多