Ассоциации тегов Django, не сохраняемые из пользовательской формы администратора

#django #forms #admin #django-taggit

#django #формы #администратор #django-taggit

Вопрос:

Здесь сходит с ума… Из оболочки я могу сделать:

 product.tags.add("a_new_tag")
  

Тег добавлен в базу данных, и связь тега с продуктом работает корректно. (т. Е., когда я это делаю Product.objects.filter(tags__name__in=["a_new_tag"] , выдается соответствующий продукт)

Что мне нужно сделать, так это добавить некоторые теги в admin при обработке формы.

Вот мой код формы (прочитайте комментарии в строках 4 и 5):

 class ProductForm(ModelForm):
        def save(self, commit=True):
            product = super(ProductForm, self).save(commit=False)
            product.type="New Type to Confirm Info is being Saved Correctly" //this is saved to the product.
            product.tags.add('a_new_tag_1') //the tag is saved to the taggit db, but the association with the product isn't kept.
            product.save()
            self.save_m2m()
            return m
  

Вместо этого я попытался выполнить сохранение в классе admin, но это тоже не работает:

 class ProductAdmin(admin.ModelAdmin):
    form = ProductForm
    def save_model(self, request, obj, form, change):
        obj.type="new_type" //this works 
        obj.tags.add("a_new_tag_2") //tag association not saved
        obj.save()
        form.save_m2m()
  

Что я делаю не так? Заранее спасибо!

Ответ №1:

Итак, оказывается, что form.save_m2m() был виновником. Если бы я взял это из своего собственного кода и прокомментировал в django.contrib.admin.options.py (строка 983), ассоциации, а также тег были сохранены.

Очевидно, что изменять код django не очень хорошая идея, поэтому в итоге я переопределил его change_view() в своем ProductAdmin (а также add_view() ). Я добавил теги после вызова, super() поэтому form.save_m2m() не стал бы перезаписывать свои ассоциации тегов.

Это странно, потому что это напрямую противоречит документации django-taggit, в которой подчеркивается, насколько важно вызывать form.save_m2m() : http://django-taggit.readthedocs.org/en/latest/forms.html

Ну, я не знаю, в чем дело, я, вероятно, зайду в группы Google с тегами и уведомлю их. В любом случае спасибо Дэвиду за вашу помощь, если ничто иное, как pdb, не является ПОТРЯСАЮЩИМ, и я не знал об этом раньше 🙂

Ответ №2:

Какую систему тегов вы используете? Возможно, вам нужно использовать product.tags.save() ?

Комментарии:

1. Привет, Дэвид, я использую django-taggit: github.com/alex/django-taggit … к сожалению, в TaggableManager нет метода save(), так что этого не может быть…

2. Hrm, ок. В таком случае, вы уверены, что он подключен? Например, type обновляется ли так, как вы ожидаете? Или, если вы используете pdb для разрыва после добавления тега, перед сохранением, отображается ли тег в списке? Появляется ли оно после сохранения?

3. я не знал о pdb, посмотрит ли def (все еще новичок в python), но, отвечая на ваши вопросы, type обновляется правильно, и когда я печатаю product.tags.all () до и после сохранения (но все еще в методе ProductForm.save), новый тег отображается правильно со старыми тегами продукта в выводе консоли. однако, когда я делаю это снаружи, т. Е. запускаю новую оболочку или пытаюсь просмотреть ее в admin, новый тег не отображается.

4. pdb — это потрясающе. интересно, что Product.objects.filter(теги__name__in=[«a_new_tag_1»]) выдает связанный продукт, пока я нахожусь в коде, который выполняется выше — но когда код завершен, ассоциация не сохранена!

5. Сохраняются ли другие изменения? Возможно ли, что транзакция базы данных откатывается или что-то в этомроде?