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でフォームを保存することです。None私はまたはで試しまし[]たが、すべての場合で、私が戻ってきたのは、pub.tags=Noneassignmeの行のエラーです:

'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 に答える