代码之家  ›  专栏  ›  技术社区  ›  Joseph

Django:更改模型窗体中的字段类型,然后将其应用于模型类

  •  2
  • Joseph  · 技术社区  · 15 年前

    我有一节课 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()
    

    我有一张读书班的表格叫 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),而是希望用户能够输入文本,即每个作者的名称的逗号分隔字符串。我的观点是这样的:

    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都是新手:[

    谢谢!

    1 回复  |  直到 15 年前
        1
  •  1
  •   Blue Peppers    15 年前

    停止django自动创建 <select> 表单条目,删除 'authors' 从字段列表中:

    class BookForm(forms.ModelForm):
        authors = CharField()
        class Meta:
            model = Book
            fields = ["title"]
    

    Django正在重写您用它自动创建的authors条目。

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

    P.S.你从这个开始:

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

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