Django:从表单提交中保存 ManyToManyField 属性



我有这样的看法:

def view(request, ...):
user = request.user
company = get_object_or_404(Company, ...)
group = get_object_or_404(Group, ...) 
form = TaskCreateForm()
if request.method == 'POST':
print(company)
print(group)
form = TaskCreateForm(data=request.POST)
if form.is_valid():
form.save(commit=False)
form.creator = user
form.company = company
form.group = group
# So these above attributes aren't actually inputs in the form, but just data passed to the model from things like the user that's sending off the form and the group they're in for example
form.save()

其中创建者(用户(和公司通过外键与此特定模型(任务,用户正在填写表单(相关联。

问题是我写form.group = group的地方,我怀疑这可能是因为组与任务模型有多对多关系。

我希望"组"是与此任务对象相关的众多组对象之一。

尝试保存表单时发生错误,如下所示:

TypeError at/company/task/625377380359841/强制使用 Unicode:需要 字符串或缓冲区,找不到无类型

这将是一个很大的帮助,谢谢!

编辑: 我还看了一下我认为可能相关的 save_m2m(( 方法,但不幸的是,这似乎没有帮助。

另外,这是我与 TaskCreateForm((相关的表单和模型代码... forms.py:

class TaskCreateForm(forms.ModelForm):
task_name = forms.CharField(widget=forms.widgets.TextInput(attrs={
'placeholder':'Activity name'}), label='Activity', required=True, min_length=3, max_length=60)
task_priority = forms.ChoiceField(choices=PRIORITY, widget=forms.widgets.Select
(attrs={'placeholder':'Priority'}), label='Importance', required=False)
class Meta:
model = Activity
fields = ['task_name', 'task_priority']

models.py:

class Task(models.Model):
company = models.ForeignKey(Company, related_name='company_activity',
verbose_name='Parent Company', on_delete=models.CASCADE, null=True)
group = models.ManyToManyField(Group, related_name='group_activity',
verbose_name='Related Group', blank=True)
creator = models.ForeignKey(AUTH_USER_MODEL, related_name='activity_creator',
verbose_name='Created by User', null=True)
task_name = models.CharField(max_length=40, verbose_name='Task')
task priority = models.CharField(max_length=18, verbose_name='Priority',
choices=PRIORITY, blank=True, null=True)
task_slug = models.SlugField(verbose_name='Slug', unique=True, blank=True, null=True)
class Meta:
verbose_name = 'Task'
def __unicode__(self):
return self.task_slug
def __str__(self):
return self.task_slug
def get_absolute_url(self):
return reverse('task-detail', kwargs={'task_slug': self.task_slug, 'co_dom': self.company.domain})
def save(self, *args, **kwargs):
task_slug(self)
super(Task, self).save(*args, **kwargs)

完整回溯:

905093298449 | 公司625377380359841 内部服务器错误:/公司/来源/机会/625377380359841/回溯(最近一次调用(:文件 "/Library/Python/2.7/site-packages/Django-1.10.2-py2.7.egg/django/core/handlers/exception.py", 第 39 行,在内部 response = get_response(request( 文件 "/Library/Python/2.7/site-packages/Django-1.10.2-py2.7.egg/django/core/handlers/base.py", 187路,_get_response response = self.process_exception_by_middleware(e, request( File "/Library/Python/2.7/site-packages/Django-1.10.2-py2.7.egg/django/core/handlers/base.py", 185行,_get_response 响应 = wrapped_callback(request, *callback_args, **callback_kwargs( 文件 "/Users/jayt/grid/company/views.py",第 181 行,task_detail act.parent_op.add(opport( 文件 "/Library/Python/2.7/site-packages/Django-1.10.2-py2.7.egg/django/db/models/fields/related_descriptors.py", 第 476 行,在获取返回self.related_manager_cls(实例(文件中 "/Library/Python/2.7/site-packages/Django-1.10.2-py2.7.egg/django/db/models/fields/related_descriptors.py", 第 783 行,在init(instance, self.source_field_name(( 文件中 "/Library/Python/2.7/site-packages/Django-1.10.2-py2.7.egg/django/db/models/base.py", 第 572 行,在repru = six.text_type(self( 类型错误:强制到 Unicode:需要字符串或缓冲区,找不到 NoneType [25/Jul/2017 17:42:51] "POST/company/task/625377380359841/HTTP/1.1" 500 81361

当您尝试添加manytomany字段数据时,您应该使用add方法。

form.group.add(group)
form.save()

在您的form.save(commit=False)行中,它将返回一个未保存的 Task 对象(假设 Task 是基于表单名称的模型(。

然后,您可以在保存之前直接操作 Task 对象。现在你正在操纵表格,我不相信这是你想要的。

所以你最终会得到:

task = form.save(commit=False)
task.creator = user
task.company = company
task.group.add(group)
task.save()

最新更新