2013-07-26 8 views
7

Mi sto esercitando con FormViews di Django.Django CreateView restituisce un errore "deve avere un valore per il campo" ... "prima che questa relazione molti-a-molti possa essere utilizzata."

In questa app, sto creando una vista PostCreate che crea un post sul blog.

Qui sono i miei codici:

models.py

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post_title = models.CharField(max_length=200) 
    post_content = models.CharField(max_length=500) 

class Tag(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    posts = models.ManyToManyField(Post) 

forms.py

class PostForm(forms.ModelForm): 
    post_title = forms.CharField(
     label=u'Title', 
     widget=forms.TextInput(attrs={'size':64}) 
    ) 
    post_content = forms.CharField(
     label=u'Content', 
     widget=forms.TextInput(attrs={'size':128}) 
    ) 
    tags = forms.CharField(
     label=u'Tags', 
     required=True, 
     widget=forms.TextInput(attrs={'size':64}) 
    ) 
    class Meta: 
     model = Post 
     exclude = ('user', 'post_date') 

views.py

class PostCreate(CreateView): 
    template_name = 'app_blog/post_save_form.html' 
    model = Post 
    form_class = PostForm 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     self.object.user = self.request.user 

     tag_names = form.cleaned_data['tags'].split() 
     for tag_name in tag_names: 
      tag, dummy = Tag.objects.get_or_create(name=tag_name) 
      self.object.tag_set.add(tag) 

     return super(PostCreate, self).form_valid(form) 

Quando ho provare a salvare un post (post-test 1) in un database, mi dà un errore:

necessità di avere un valore per il campo "post" prima di questo molti-a-molti può essere Usato.

Sembra che il problema sia causato dalle righe in views.py in cui ho diviso il campo "tag" e aggiunto i tag al campo tag_set dell'oggetto post. Suppongo che questa logica non dovrebbe essere incluso nel metodo form_valid ... ma non so dove altro questo dovrebbe essere attuata ..

Qualsiasi aiuto sarebbe molto apprezzato :) Grazie

risposta

9

No, questo non è qual è il problema Il problema è che non hai ancora salvato l'oggetto Post, quindi non puoi creare una relazione molti-a-molti con esso (perché sotto il cofano, m2m è solo una tabella di collegamento con chiavi esterne a entrambe le entità). La soluzione è prima di salvare self.object.

+0

tuo suggerimento risolto l'errore !! Tuttavia, dopo averlo fatto, l'oggetto Tag viene aggiunto per OGNI post per qualche motivo .... Ad esempio, se aggiungo Tag1 a Post # 4, Tag1 viene aggiunto a Post # 1, Post # 2, Post # 3 e Post # 4 .. Idk perché questo sta accadendo ... :( – user2492270

+0

Sì. Il suggerimento aiuta davvero. A proposito, a volte penso che i messaggi di errore siano verdi. Messaggi di errore (confusi) non validi (come questo) devono essere pensati google a chiedere (e anche a cui rispondere). Forse ancora peggio, se l'interrogante non sa di accettare una risposta corretta ;-) – stanleyxu2005

+0

Grazie per avermi risparmiato ore. .... –

7

È necessario salvare il vostro oggetto dopo l'assegnazione utente e quindi fare le cose con le relazioni m2m:

self.object = form.save(commit=False) # Not saved to database. 
self.object.user = self.request.user 
self.object.save() # Saved. 

tag_names = form.cleaned_data['tags'].split() 
for tag_name in tag_names: 
    tag, dummy = Tag.objects.get_or_create(name=tag_name) 
    self.object.tag_set.add(tag)