2012-11-15 34 views
3

我想要做的是讓人們通過在charfield中寫入來標記帖子,用','分隔標籤。從CreateView中的字符串Django ManyToMany

現在這是我的模型(就我們關心的部分)

class Tag(models.Model): 
    name = models.CharField(max_length=100, default='') 


    def __unicode__(self): 
     return "%s" % (self.name) 


class Post(models.Model): 
    ..... 
    tags = models.ManyToManyField(Tag,blank=True, null=True) 

然後我一個形式

class PostForm(ModelForm): 
... 
    tags = forms.CharField(label=(u'Tags ')) 

    class Meta: 
     model = Publication 

    def __init__(self, *args, **kwargs): 
     self.helper = FormHelper() 
     self.helper.form_method = 'post' 
     self.helper.add_input(Submit('submit', 'Invia')) 
     self.helper.form_class = 'form-horizontal' 

     super(PostForm, self).__init__(*args, **kwargs) 

然後我我CreateView的,而我覆蓋了form_valid方法使字符串解析

class PostAdd(CreateView): 
    template_name = 'form.html' 
    form_class = PostForm 
    success_url='/' 

    def form_valid(self, form): 
     pub = form.save(commit=False) 
     pub.tags=None 
     pub.save() 

     tags=str(self.request.POST.get('tags')) 
     tags = tags.split(',') 
     tl=[] 
     for tag in tags: 
      tl.append(Tag.objects.get_or_create(name=tag)) 
     pub.tags.add(tl) 

     form.save_m2m() 
     return HttpResponseRedirect(self.get_success_url()) 

我所做的就是用commit = False保存窗體,以便更改值的標籤。我試着用None[]但在所有的情況下,我所背的pub.tags=None assignme線的錯誤:

'Post' instance needs to have a primary key value before a many-to-many relationship can be used. 

回答

4

給你設置的「標籤」屬性設置爲無,但您的出版物不還有一個主鍵,所以多對多的關係很難。

你需要做的是先保存它。

你會發現更多有關這個here

def form_valid(self, form): 
    pub = form.save(commit=False) 
    pub.save() 
    pub.tags=None 


    tags=str(self.request.POST.get('tags')) 
    tags = tags.split(',') 
    tl=[] 
    for tag in tags: 
     tl.append(Tag.objects.get_or_create(name=tag)) 
    pub.tags.add(tl) 
    pub.save() 
    form.save_m2m() 
    return HttpResponseRedirect(self.get_success_url()) 
+0

THX,它比我預期的更簡單。順便說一句,不確定form.save_m2m()在這種情況下是必要的。 PS:我無法將標籤添加到標籤,所以我每次將標籤添加到m2m關係。 – EsseTi