3

我想要做的是让人们通过在字符域中书写来标记帖子,用“,”分隔标签。

现在这是我的模型(只是我们关心的部分)

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 保存表单以更改标签的值。我尝试使用Noneor[]但在所有情况下,我返回的是pub.tags=None分配行中的错误:

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

1 回答 1

4

在这里,您将“标签”属性设置为无,但您的出版物还没有主键,因此多对多关系很难。

你要做的就是先保存它。

您将在此处找到有关此的更多信息

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())
于 2012-11-15T17:49:20.407 回答