我有一个类Book:
from django.db import models
from users.models import User
class Book(models.Model):
title = models.CharField(max_length=150)
authors = models.ManyToManyField("Author")
哪个链接到 Author 类:
class Author(models.Model):
name = models.CharField(max_length=150)
birthday = models.DateField()
我有一个 Book 类的表单,叫做 BookForm
from django import forms
from django.forms import CharField
from books.models import Book
class BookForm(forms.ModelForm):
authors = CharField()
class Meta:
model = Book
fields = ["title","authors"]
我想用足够简单的 BookForm 创建书籍,而不是像默认情况下那样从列表中挑选作者(因为它是 ManyToManyField),我希望用户能够输入文本,每个作者姓名的逗号分隔字符串。我的 View 是这样设置的:
def create_book(request):
if request.user is None:
return redirect("/users/login/")
if request.method == "POST":
form = BookForm(request.POST)
if form.is_valid():
nbook = form.save(commit=False)
authorlist = form.authors.split(",")
nbook.owner = request.user
nbook.save()
for auth in authorlist:
nbook.authors.create(name=auth)
return redirect("/books/")
else:
form = BookForm()
return render_to_response("books/create.html", {
"form": form,
}, context_instance=RequestContext(request))
但这行不通。我得到错误 'BookForm' object has no attribute 'authors'。我不确定这里是否存在基本问题或者它只是语法问题,但有人可以伸出援手吗?我对 Python 和 Django 都是全新的:[
谢谢!
请您参考如下方法:
停止django 自动创建<select>表单条目,删除 'authors'来自字段列表:
class BookForm(forms.ModelForm):
authors = CharField()
class Meta:
model = Book
fields = ["title"]
Django 正在用它自动创建的条目覆盖您创建的作者条目。
至于你的第二个错误,从绑定(bind)表单获取数据的正确方法不是通过 form.authors , 但来自 form.cleaned_data['authors'] .
附言你从这个开始:
if request.user is None:
return redirect("/users/login/")
为此你应该使用 login_required装饰器。
