Skip to main content
 首页 » 编程设计

python之Django:更改模型表单中的字段类型,然后将其应用于模型类

2025年05月04日21zhwl

我有一个类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装饰器。