Django - CreateView / Modelform不会保存多对多

时间:2017-12-09 14:43:27

标签: django django-forms django-views

我遇到以下问题: 我正在开发简单的数据库应用程序,用户可以在其中添加两个对象并创建' Notes'对于这些对象。 反过来,这些注释可以有标签(多对多),可用于过滤它们。

但是,当我创建新的Note时,附带的标签不会保存在表单中。

以下是我用于Noteform的代码

class NoteForm(ModelForm):

  class Meta:
      model = Note
      fields = ['content', 'tags']

  def __init__(self, *args, **kwargs):
      self.model = kwargs.pop('model')
      self.app = kwargs.pop('app')
      self.key = kwargs.pop('model_pk')
      self.model_object = apps.get_model(self.app, self.model)
      self.linked_object = self.model_object.objects.get(pk=self.key)
      super(NoteForm, self).__init__(*args, **kwargs)


  def save(self, commit=True):
      note = super(NoteForm, self).save(commit=False)
      note.content_object = self.linked_object
      if commit:
          note.save()
      return note

以下是随附的观点:

class BaseNoteCreateView(LoginRequiredMixin, CreateView):
  login_url = '/login/'
  form_class = NoteForm

def get_form_kwargs(self):
      kwargs = super(BaseNoteCreateView, self).get_form_kwargs()
      kwargs['model'] = self.kwargs['model']
      kwargs['app'] = self.kwargs['app']
      kwargs['model_pk'] = self.kwargs['model_pk']
      return kwargs

def form_valid(self, form):
      form.instance.user = self.request.user
      return super().form_valid(form)

现在我读到我可能必须使用save_m2m()方法。但是,每当我将其包含在表单或视图中时,我都会遇到

'NoteForm' object has no attribute 'save_m2m'

错误。

当我打印' kwargs'在表单中,我看到标签包含在帖子中

{'initial': {}, 'prefix': None, 'data': <QueryDict: {'csrfmiddlewaretoken': ['EOWT03UtSdFdJ9H2qD0oKYvv8GZy8ZvWTBRRTV3JBRuULuDcaQH4dWgC2S2bUYJS'], 'content': ['okj'], 'tags': ['2', '3']}>, 'files': <MultiValueDict: {}>, 'instance': None, 'model': 'book', 'app': 'source_tracker', 'model_pk': '1'}

有谁知道我做错了什么,以及为什么两个标签都没有保存而且save_m2m()方法会触发错误?

提前感谢您的帮助!

编辑:我已经包含了&#39;注意&#39; (和标签)模型如下所示

 class Tag(models.Model):
      added_on = models.DateTimeField(auto_now=True)
      name = models.CharField(max_length=300)
      notes = GenericRelation('Note', blank=True, null=True, 
      related_name='notes')
      user = models.ForeignKey(settings.AUTH_USER_MODEL)

      def __str__(self):
          return self.name



 class Note(models.Model):
      added_on = models.DateTimeField(auto_now=True)
      content = models.TextField()
      content_type = models.ForeignKey(ContentType)
      object_id = models.PositiveIntegerField()
      content_object = GenericForeignKey('content_type', 'object_id')
      tags = models.ManyToManyField(Tag, blank=True, 
      related_name='note_tags')
      user = models.ForeignKey(settings.AUTH_USER_MODEL)

      def __str__(self):
          return self.content[:30]

0 个答案:

没有答案