繁体   English   中英

Django:以模型形式更改字段类型,然后将其应用于模型类

[英]Django: Changing a field type in a model form and then applying it to the model class

我有一堂课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创建Books,但是我希望用户能够输入文本(用逗号分隔),而不是像默认情况下那样从列表中挑选作者(因为它是ManyToManyField)。每个作者姓名的字符串。 我的视图设置如下:

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用自动创建的条目覆盖了您创建的authors条目。

至于第二个错误,从绑定的表单中获取数据的正确方法不是通过form.authors ,而是通过form.cleaned_data['authors']

PS您从此开始:

if request.user is None:
    return redirect("/users/login/")

为此,您应该使用login_required装饰器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM