2015-02-26 2 views
0

Мне нужно создать форму для добавления нового сообщения в свой блог.Django Form for ManyToMany fields

Model.py

class Category(models.Model): 
    title = models.CharField(max_length=200) 
    ... 
    ... 
    def __unicode__(self): 
     return self.title 

class Post(models.Model): 

    title = models.CharField(max_length=80) 
    pub_date = models.DateTimeField() 
    text = models.CharField(max_length=140) 
    ... 

    categories = models.ManyToManyField(Category, blank=True, null=True, through='CategoryToPost') 

    def __unicode__(self): 
     return self.title 

class CategoryToPost(models.Model): 

    post = models.ForeignKey(Post) 
    category = models.ForeignKey(Category) 

Views.py

def add_post(request): 

form = PostForm() 
if request.method == "POST": 
    form = PostForm(request.POST) 
    if form.is_valid(): 
     form = PostForm(request.POST) 
     post = form.save(commit=False) 
     post.author = User.objects.get(id = request.user.id) 
     post.categories = post.categorytopost_set 
     ... 
     post.save() 
     return HttpResponseRedirect('/') 
    else: 
     return render(request, 'add_post.html', {'error': True, 'form': form}) 
else: 
    return render(request, 'add_post.html', {'error': True, 'form': form}) 

Form.py

class PostForm(ModelForm): 

    class Meta: 
     model = Post 
     fields = ('title', 'text', 'categories', 'tags') 

Когда я пытаюсь вставить catogories в новой должности от шаблона "add_post.html" всегда имеется ошибка, относящаяся к ManyToMany:

«Невозможно установить значения на ManyToManyField, который определяет промежуточную модель. Используйте CategoryToPosts менеджер вместо «

+0

Почему вы добавляете поле 'категорий' в свой ModelForm вручную? Почему бы просто не включить его в кортеж 'fields'? – Selcuk

+1

И в чем смысл явной таблицы? –

+0

Плюс, если вы говорите, что есть «всегда ошибка», вы должны сказать нам, что это такое. –

ответ

0

Проблема связана с этой инструкцией:.

post.categories = post.categorytopost_set 

От Джанго documentation:

В отличие от нормальных многих к многим полям, вы не можете использовать добавить , create или назначение (т. е. beatles.members = [...]) для создания отношений.

В вашем сценарии вы должны вручную создать объект CategoryToPost с обеими ссылками t o Post и Category и сохраните его.

+0

С «за» в ключевых «категориях» QueryDIct для создания и сохранения нескольких категорий. – Luke09