【发布时间】: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