我遇到以下问题: 我正在开发简单的数据库应用程序,用户可以在其中添加两个对象并创建' 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]