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

Допустим, у меня будет что-то вроде этого:

Forms.py

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

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

9
avatar 19 Мар 2011 в 05:48

3 ответа

Лучший ответ

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

Ваш models.py:

from django.db import models

from taggit.managers import TaggableManager

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

    tags = TaggableManager()

Ваш forms.py

from taggit.forms import *

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

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

Ваш 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/')
13
dting 19 Мар 2011 в 13:41
2
Это, конечно, не удаляет теги, если вы отметили их для удаления.
 – 
Nathan Keller
6 Май 2013 в 14:59

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

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

К

object.tags.add(*m_tags)
7
seb 23 Дек 2011 в 05:34

См. Инструкции здесь: 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()
3
a.m. 7 Апр 2012 в 19:44