Django: изменение типа поля в форме модели, а затем его применение к классу модели - PullRequest
2 голосов
/ 29 ноября 2010

У меня есть класс 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 Ответ

1 голос
/ 29 ноября 2010

Чтобы остановить автоматическое создание django записи формы <select>, удалите 'authors' из списка полей:

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

Django переопределял созданную вами запись авторов автоматически созданной.

Что касается вашей второй ошибки, правильный способ получения данных из связанной формы будет не через form.authors, а из form.cleaned_data['authors'].

P.S. Вы начинаете с этого:

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

Для этого вы должны использовать декоратор login_required.

...