джанго - форма джанго-таггит - PullRequest
8 голосов
/ 19 марта 2011

Я хотел бы использовать django-taggit ( нажмите здесь ). В документации ( нажмите здесь ) говорится об использовании ModelForm для создания формы, но у меня уже есть форма, которую я хотел бы использовать.

Скажем, если у меня есть что-то вроде этого:

forms.py

class MyForm(forms.Form):
    ......
    tags = forms.CharField(max_length=200, widget=forms.Textarea)

как сохранить теги из поля tags? Что входит в мой views.py? Реальный пример был бы по-настоящему оценен.

Ответы [ 3 ]

12 голосов
/ 19 марта 2011

Я не слишком знаком с приложением django taggit, но похоже, что если вы хотите использовать те же настройки полей и виджетов, которые использует приложение, вы можете импортировать их из taggit.forms (https://github.com/alex/django-taggit/blob/master/taggit/forms.py ):

your models.py:

from django.db import models

from taggit.managers import TaggableManager

class Food(models.Model):
    name = models.CharField(max_length=20)

    tags = TaggableManager()

your forms.py

from taggit.forms import *

class MyForm(forms.Form):
    name = forms.CharField()
    m_tags = TagField()

TagField вернет обработанный ввод, используя метод parse_tags из utils.py в приложении taggit. Возвращаемый результат выглядит как очищенный список (набор (слова))

your views.py

if form.is_valid():
    name = form.cleaned_data['name']
    m_tags = form.cleaned_data['m_tags']
    object = Food(name=name)
    object.save()
    for m_tag in m_tags:
        object.tags.add(m_tag)
    return HttpResponseRedirect('/thanks/')
7 голосов
/ 23 декабря 2011

Я не могу комментировать использованный / "зеленый тик" ответ.Но я бы поменял Блок

for m_tag in m_tags:
    object.tags.add(m_tag)

на

object.tags.add(*m_tags)
3 голосов
/ 07 апреля 2012

См. Инструкции здесь: https://github.com/alex/django-taggit/blob/master/docs/forms.txt

Если при сохранении формы вы используете опцию commit=False, вам нужно позвонить save_m2m() в форме после сохранения объекта, так же, как для создать с нормальным много-много полей на нем ::

if request.method == "POST":
    form = MyFormClass(request.POST)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        obj.save()
        # Without this next line the tags won't be saved.
        form.save_m2m()
...