Джанго: Сохранить в поле «многие ко многим» в методе save () ModelForm? - PullRequest
1 голос
/ 14 июля 2010

Я пишу приложение для веб-блогов в Django.У меня сейчас 2 модели Post и PostMeta.Post - это стандартная модель стиля записей с такими полями, как автор, заголовок, контент и т. Д. Она также содержит одно поле многие-ко-многим, называемое post_meta, которое связано с моей второй моделью PostMeta.PostMeta - это простая модель имя / значение с двумя полями, meta_key и meta_value.

Я пытаюсь настроить форму модели Post в интерфейсе администратора, чтобы она была более интуитивной.В частности, я хочу абстрагироваться от создания ассоциаций PostMeta, а не видеть неинтуитивное поле выбора, которое по умолчанию отображается для администратора.Вместо этого я хочу показать текстовое поле вместо этого поля выбора, где пользователь может ввести разделенный запятыми список тегов, связанных с сообщением.Когда форма отправлена, я хочу разделить ввод поля тега на отдельные теги и сохранить каждый как PostMeta, где meta_key будет установлен в «TAG», а meta_value будет одной из строк, разделенных запятыми.У меня есть, кажется, я не могу получить его, чтобы сохранить правильно.Я не уверен, есть ли проблема с моим синтаксисом (я относительно новичок в Python) или есть что-то еще, что мне нужно сделать, что я мог пропустить.Вот фрагмент моего admin.py:

class PostAdminForm(forms.ModelForm):
    tags = forms.CharField(max_length=200)
    class Meta:
        model = Post
    def save(self, commit=True):
        model = super(PostAdminForm, self).save(commit=False)
        if commit:
            model.save()
            splitTags = self.cleaned_data['tags'].split(',')
            for tag in splitTags:
                pm = PostMeta(meta_key="TAG", meta_value=tag)
                pm.save()
                model.post_meta.add(pm)
        return model

class PostAdmin(admin.ModelAdmin):
    model = Post
    form = PostAdminForm

admin.site.register(Post, PostAdmin)

Любые советы или предложения о том, как сделать эту работу, были бы великолепны.Все еще учусь: \

1 Ответ

2 голосов
/ 14 июля 2010

Самая непосредственная проблема в вашем коде заключается в том, что когда администратор Django вызывает метод save(), аргумент commit почти всегда равен False.Однако, если вы просто проигнорируете значение commit, вы не сможете сделать model.post_meta.add(pm) для вновь созданных сообщений, так как модель еще не была создана в базе данных (и, следовательно, не может быть упомянута в Postна PostMeta м2м).

См. мой ответ на другой пост , который, я думаю, также применим в вашем случае, и содержит довольно много кода, который может оказаться полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...