2010-11-29 19 views
1

J'ai une classe Book:Django: Modification d'un type de champ sous forme de modèle, puis l'appliquer à la classe modèle

from django.db import models 
from users.models import User 

class Book(models.Model): 
    title = models.CharField(max_length=150) 
    authors = models.ManyToManyField("Author") 

qui relie à la classe Auteur:

class Author(models.Model): 
    name = models.CharField(max_length=150) 
    birthday = models.DateField() 

Et je ont une forme pour la classe du livre appelé 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"] 

Je veux créer des livres avec le BookF orm qui est assez simple, mais au lieu de choisir les auteurs d'une liste comme cela arriverait avec la valeur par défaut (puisque c'est un ManyToManyField), je veux que l'utilisateur puisse entrer du texte, une chaîne séparée par des virgules du nom de chaque auteur. Ma vue est configurée comme suit:

def create_book(request): 
    if request.user is None: 
     return redirect("https://stackoverflow.com/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)) 

Mais cela ne fonctionne pas. J'obtiens l'erreur 'BookForm' object has no attribute 'authors'. Je ne suis pas sûr s'il y a un problème fondamental ici ou si c'est juste la syntaxe, mais quelqu'un peut-il donner un coup de main? Je suis complètement nouveau à la fois Python et Django: [

Merci!

Répondre

0

Pour arrêter django créer automatiquement l'entrée de formulaire <select>, retirez le 'authors' de la liste des champs:

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

Django était PRÉPONDÉRANTS l'entrée des auteurs que vous avez créé avec celui automatiquement créé. En ce qui concerne votre deuxième erreur, la manière correcte d'obtenir des données à partir d'un formulaire lié ne serait pas via form.authors, mais à partir de form.cleaned_data['authors'].

P.S. Vous commencez avec ceci:

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

Pour cela, vous devez utiliser le décorateur login_required.

+0

Merci beaucoup pour votre aide. En ce qui concerne la connexion, je n'utilise pas la fonctionnalité django auth/login officielle selon les directives [déraisonnables] de mon affectation. – Joseph

+1

Ah. Sois un bon sport et écris tes propres décorateurs. Je suis sûr que vous obtiendrez de meilleures notes pour "expérimenter avec le paradigme de programmation méta". –