【问题标题】:Django: Saving ManyToManyField attribute from form submitDjango:从表单提交中保存 ManyToManyField 属性
【发布时间】:2017-12-30 11:47:07
【问题描述】:

我有这样的看法:

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()

创建者(用户)和公司通过 ForeignKey 与此特定模型(任务,用户填写表单)相关联。

问题是我写form.group = group的地方,我怀疑这可能是因为Group与Task模型有ManyToMany关系。

我希望“组”成为与此任务对象相关的众多组对象之一。

尝试保存表单时出现错误,如下所示:

/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 内部服务器错误: /company/sourceup/opportunities/625377380359841/ Traceback(最近一次通话最后一次):文件 "/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) 文件“/Library/Python/2.7/site-packages/Django-1.10.2-py2.7.egg/django/core/handlers/base.py”, 第 185 行,在 _get_response 中 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 行,在 get 中 返回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 中 (实例,self.source_field_name))文件“/Library/Python/2.7/site-packages/Django-1.10.2-py2.7.egg/django/db/models/base.py”, 第 572 行,在 repr 中 u = Six.text_type(self) TypeError: coercing to Unicode: need string or buffer, NoneType found [25/Jul/2017 17:42:51] "POST /company/task/625377380359841/HTTP/1.1" 500 81361

【问题讨论】:

  • 添加一个 print(company) 和 print(group) 并告诉我返回什么
  • @MauricioCortazar 在哪里写这个?
  • If 请求之后 ==post 语句
  • 这打印了公司的 unicode,然后是组的 unicode。错误紧随其后。
  • 查看终端,看看打印了什么

标签: python django


【解决方案1】:

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

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

所以你最终会得到:

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

【讨论】:

  • 这仍然给我和以前一样的错误;任何其他想法为什么会这样?我已将完整的追溯添加到我的问题中
  • 您需要发布更多代码,您发布的内容以及堆栈跟踪中出现错误的位置似乎缺少某些内容。具体来说,company/views.py 中第 181 行的代码
  • 第 181 行是 task.group.add(group) 的编写位置,我不确定我应该包含哪些其他代码
【解决方案2】:

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

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

【讨论】:

  • 不幸的是,这返回了与以前相同的错误
  • 添加你的模型和与TaskCreateForm相关的表单代码
  • 我已经更新了我的问题,包括 Task 模型的 models.py 和 forms.py,谢谢
  • 你忘记从Activity模型的save方法返回
  • 我的模型中有save方法,是不是也要在form类中添加save,删除model的save方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2017-06-14
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多