Django ManyToMany от String в CreateView

Това, което искам да направя, е да дам на хората да маркират публикация, като пишат в символно поле, разделяйки етикетите с „,“.

сега това е моят модел (само тази част, която ни интересува)

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.

person EsseTi    schedule 15.11.2012    source източник


Отговори (1)


Ето ви настройките за атрибут "тагове" на None, но вашата публикация все още няма първичен ключ, така че връзката "много към много" е трудна.

Това, което трябва да направите, е първо да го запазите.

Ще намерите повече за това тук

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())
person Nezo    schedule 15.11.2012
comment
Thx, беше по-просто от това, което очаквах. между другото, не съм сигурен, че form.save_m2m() е необходим в този случай. PS: не мога да добавя списък към тагове, така че всеки път добавям таг към връзката m2m. - person EsseTi; 16.11.2012