#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. Сохраняются ли другие изменения? Возможно ли, что транзакция базы данных откатывается или что-то в этомроде?